2013-10-29 56 views
1

請注意,這不是MySQL的我談論的BigQuery如何BigQuery中選擇在同一臺場沒有加入

我需要在谷歌的BigQuery

SELECT * FROM searchable.keyword AS kw1, 
(SELECT keyword From searchable.keyword 
    GROUP BY keyword ORDER BY keyword DESC) AS kw2 
WHERE kw1.keyword CONTAINS(kw2.keyword) 
# or even kw1.keyword = kw2.keyword <-- I don't need this now but it doesn't work as well 
執行以下操作

它給錯誤KW2是未知的,KW1以及

注意:我可以執行此查詢與JOIN然後過濾,但問題是,表中有更多的日一個450K條目,這樣的連接會導致大量的450K平方,因爲連接條件是父ID,並且450K具有相同的父ID,並且BigQuery不允許在除Table1外的連接條件中添加Any。場= Table2.field

+0

你能否留下一些解釋你想要做什麼的樣本數據?包含示例數據的公共BigQuery表將非常適合嘗試替代方案。 –

回答

3

有兩個問題。第一個是bigquery只支持equi-join - 也就是說,你只能加入exa ct平等。第二個是逗號UNION ALL不加入(這是不幸的遺產的行爲) 要做到這一點,你需要計算全交叉連接:

(SELECT keyword, 1 as cross FROM searchable.keyword) AS kw1 
JOIN EACH 
    (SELECT keyword, 1 as cross FROM searchable.keyword GROUP BY keyword) 
ON kw1.cross = kw2.cross 
WHERE kw1.keyword CONTAINS(kw2.keyword) 

當然,這種交叉連接會爆炸爲一個相當大的桌子。

+0

我已經這樣做了,但我會將答案標記爲真,因爲它實際上是正確的。 – Shehabix

0

試試這個 -

SELECT * FROM searchable.keyword AS kw1, 
(SELECT keyword From searchable.keyword 
    GROUP BY keyword ORDER BY keyword DESC) AS kw2 
WHERE INSTR(kw1.keyword, kw2.keyword,1,1) <>0; 
+0

問題不在於「CONTAINS」或「INSTR」中讀取上述錯誤。 – Shehabix

-1

我不知道這會與谷歌的大查詢工作,但您可以嘗試此語法

(SELECT * FROM searchable.keyword) kw1, 
(SELECT keyword From searchable.keyword 
GROUP BY keyword ORDER BY keyword DESC) kw2 
WHERE kw1.keyword CONTAINS(kw2.keyword) 
+0

它不工作,BigQuery是愚蠢的,(這不是MySQL) – Shehabix

0

2的方法,我會解決這個:

  1. 使用滯後和鉛的功能。這樣你可以在單個表上運行,並提取具有相同值的以下記錄(它僅適用於=,或者包含在字符串的開頭)。

  2. 使用虛擬連接創建一個完整的交叉連接條件,然後將條件放在WHERE子句中。事情是這樣的:

    SELECT * FROM 
    (SELECT *, 1 as one from table) A 
    JOIN 
    (SELECT *, 1 as one from table) B 
    ON A.One=B.One 
    WHERE INSTR(A.keyword, B.keyword,1,1) <>0 
    

性能將不會很大,但它的工作。