数据变换:存在性子查询
我们接续上一个教程的结果继续操作。
存在性子查询是另外一种表格连接的方式,我们用一个例子来解释这个概念:
{ "select": ["id", "A", "B"], "from": ["dir.a"], "exists": [{ "subquery": { "select": ["C", "D"], "from": ["dir.b"] }, "filter": ["C = A", "D = B"], "alias": "existCD" }], "where": ["existCD"] }
在这个例子中,我们希望查询所有表格A中满足下列条件的数据:存在一个表格B中的数据, 使得其C、D列的数值分别等于A中A、B列的数值。我们可以看到结果如下所示。
我们稍微详细的看一下上面的例子。事实上,存在性子查询的作用是给表格A中的每一行增加一个值为 0 或 1 的特殊指示标识 existCD, 其值为 1 当且仅当子查询的结果包含满足所有过滤条件的行。 然后我们可以在where语句中利用这个特殊指示标识完成想要的筛选效果。 除了直接将指示标识作为筛选条件外,我们也可以将其作为一个普通的列参与计算,如下例所示:
{ "select": ["id", "A", "B", "existCD"], "from": ["dir.a"], "exists": [{ "subquery": { "select": ["C", "D"], "from": ["dir.b"] }, "filter": ["C = A", "D = B"], "alias": "existCD" }], "where": ["!existCD"] }
最终结果如下:
与最初的例子相比,上面的语句查询所有表格A中不满足存在性条件的数据点, 可以看到视图的结果包含 8 行,即原始表格除去满足条件的 2 行,符合我们的预期。