2014-01-19 36 views
6

我試圖運行類似的查詢:「我的別名」是一個內嵌表,所以不能在外部的外部聯接

Select Table1.a,Table1.b,Table2.c 
From 
(Select a, max(x) as b 
from Tbl1 
group by a 
) as Table1 
LEFT JOIN EACH Table2 
ON 
Join Condition 

,我得到「表1是一個內嵌表,所以不能在外連接的外部。「

當從外部連接到內部,它的工作原理(因此沒有語法問題...)。

有人可以解釋這個消息,我應該做什麼不同以避免它?

感謝

回答

5

TL; DR:使用​​在內部查詢。

內部查詢

Select a, max(x) as b from Tbl1 group by a 

不parallizable。您可以並行計算部分結果,但爲了知道每個值爲a'的全局max(x)',您只需要在一個地方運行該結果。在外部查詢中使用JOIN EACH時,您正在指示查詢引擎需要並行執行JOIN執行。但是,您沒有可寬容的來源,因此查詢失敗。

有兩種方法可以解決此問題:第一種方法是使用內部查詢的明確並行版本 - 只需使用​​而不是GROUP BY。這可以並行執行,因爲第一步是通過a字段對基礎表進行排序,以便可以計算並行工作器中每個a字段的全局最大值。如果內部查詢是可並置的,那麼外部查詢也可以並行執行。這看起來像:

Select Table1.a,Table1.b,Table2.c 
From 
(Select a, max(x) as b 
from Tbl1 
group EACH by a -- note the EACH keyword here 
) as Table1 
LEFT JOIN EACH Table2 
ON 
Join Condition 

第二個選項是對外部查詢使用JOIN代替JOIN EACH。這可能會遇到大小限制,具體取決於Table2的大小(因爲要執行非每個連接,右側的表需要'小')。

這是公認的次佳;您必須瞭解查詢引擎如何工作才能使查詢運行。也就是說,我們(在bigquery和dremel團隊中)正在努力使查詢「正常工作」,以便您不必處理這類問題。我們正在取得一些進展,在過去的幾個月裏,這些類型的錯誤已被刪除(例如,直到最近一次內部連接也會失敗),但我們仍有一段路要走。

感謝您將此引入我們的注意。我提交了一個內部錯誤,以便我們可以在將來更好地完成這項工作。

相關問題