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

时间:2016-01-21 15:07:01

标签: google-bigquery

我可以考虑在Google BigQuery中过滤2种方法。 (比较说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)

3 个答案:

答案 0 :(得分:3)

第二个仅限于一个且只有一个要过滤的字段。

首先可以使用多个字段进行过滤,如下所示

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

答案 1 :(得分:1)

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

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中的5s和7s。

答案 2 :(得分:0)

第一个总是查询数据库的方式,只是为了扩展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,它将只返回不同的值(这将阻止它多次返回相同的项目)