使用 LEFT OUTER JOIN 或 Anti-join 的 BigQuery 过滤器

BigQuery filter using LEFT OUTER JOIN or Anti-join

我可以想到 2 种在 Google BigQuery 中进行过滤的方法。 (假设 Table2 很小。)哪种过滤方法更可取,为什么?它取决于table1的大小吗?或者还有其他更好的方法吗?

SELECT
  a.ID
FROM
  table1 AS a
LEFT OUTER JOIN
  table2 AS b
ON
  a.ID = b.ID
WHERE 
  b.ID is NULL

SELECT
  ID
FROM
  table1
WHERE
  ID NOT IN (
    SELECT
      ID
    FROM
      table2)

第二个仅限于一个字段作为筛选依据。

First 可用于按多个字段进行筛选,如下所示

SELECT
  a.ID
FROM
  table1 AS a
LEFT OUTER JOIN
  table2 AS b
ON
  a.ID = b.ID AND a.Field2 = b.Field2 AND a.Field3 = b.Field3
WHERE 
  b.ID is NULL

第一个始终是查询数据库的方式,只是为了扩展 Mikhail 所说的内容,例如您还可以在 Where 下添加 AND。

SELECT
  a.ID
FROM
  table1 AS a
LEFT OUTER JOIN
  table2 AS b
ON
  a.ID = b.ID AND a.Field2 = b.Field2 AND a.Field3 = b.Field3
WHERE 
  b.ID is NULL AND a.id=75

此外,如果您在查询开始时使用 SELECT DISTINCT,它只会 return 个不同的值(这将阻止它 return 多次使用同一项目)

我测试了两个字段的反连接,差异很明显。

SELECT fields, ..
FROM inputA A
LEFT JOIN inputB B
  ON A.key = B.key AND A.key2 = B.key2
WHERE B.key IS NULL AND B.key2 IS NULL

性能优于其 NOT IN 等效项:

SELECT fields, ..
FROM inputA A
WHERE key NOT IN (SELECT NUM_RUT FROM key)
  AND key2 NOT IN (SELECT key2 FROM inputB)

在这种情况下,读取 4.6Gb 后 BigQuery 中的时间为 5 秒与 7 秒。