使用 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 秒。
我可以想到 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 秒。