BigQuery 标准 SQL 查询返回错误答案

aug*_*lec 5 sql google-bigquery

这个查询:

SELECT x 
FROM dataset.table_a 
WHERE x NOT IN (SELECT x FROM dataset.table_b)
Run Code Online (Sandbox Code Playgroud)

即使以下情况也返回零记录:

  • 字段包含 1,326,932xtable_a不同的字符串值

  • 字段包含 18,885xtable_b不同的字符串值

我不懂为什么。此外,在 BigQuery 旧版 SQL 中,此查询会返回正确的答案。

Ell*_*ard 4

我怀疑我知道答案——这是由于使用旧版 SQL 时的错误处理NULLNOT IN而标准 SQL 的行为与 SQL 标准一致。有一个文档错误可以将其添加到迁移指南中,但尚未解决。

IN 的文档 ( https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#in-operators ) 指出:

IN 列表中带有 NULL 的 IN 只能返回 TRUE 或 NULL,不能返回 FALSE

您可以通过此查询实现所需的行为,NOT EXISTS而是使用:

SELECT x
FROM dataset.table_a AS t
WHERE NOT EXISTS (
  SELECT 1 FROM dataset.table_b
  WHERE t.x = x
);
Run Code Online (Sandbox Code Playgroud)