SemDB 示例教程
数据变换:存在性子查询

我们接续上一个教程的结果继续操作。

存在性子查询是另外一种表格连接的方式,我们用一个例子来解释这个概念:

{
  "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 行,符合我们的预期。

© 2025