2016-01-21 83 views
1

我可以想象在Google BigQuery中過濾兩種方法。 (說表2很小。)哪種過濾方法更可取,爲什麼?這取決於table1的大小嗎?還是有另一種更好的方法?使用LEFT OUTER JOIN或反加入的BigQuery過濾器

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) 

回答

2

第二被限制爲一個,並且通過過濾只有一個字段。

首先可以使用多個字段進行過濾,像下面

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 
+0

非常真實的。但你有什麼想法如何比較兩種方法的性能? – Oof

+1

從未做過BigQuery的基準測試。我認爲這是因爲直覺上我總是認爲這裏的加入版本是一個贏家。我認爲,這個子查詢版本無論如何都被翻譯成在執行過程中加入,並且可能只有當只有一個加入時才快捷。順便說一下,最近谷歌團隊介紹了查詢計劃解釋 - https://cloud.google.com/bigquery/query-plan-explanation - 所以你可以嘗試自己看看它 –

0

第一個是始終查詢數據庫,只是在說了什麼米哈伊爾你也可以添加和下膨脹的方式例如,在哪裏。

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 

此外,如果你選擇使用在查詢的開始只會返回不同的值DISTINCT(這將阻止它返回相同的項目超過一次)