2014-01-19 1 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は、インラインテーブルである」取得します外部結合の外側にはできません」

JoinをOuterからInnerに変更すると動作します(したがって、構文の問題はありません...)。

誰かがこのメッセージを説明してもらえますか?それを避けるためにはどうすればよいですか?

おかげ

答えて

5

TL; DR:内側のクエリで​​を使用してください。

内部クエリ

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

はparallizableではありません。部分的な結果は並行して計算できますが、max(x)の各値がa 'であることを知るためには、1つの場所で実行する必要があります。外部クエリにJOIN EACHを使用すると、JOINの実行を並列化する必要があることがクエリエンジンに指示されます。ただし、パラレル化可能なソースがないため、クエリは失敗します。

これを修正するには2つの方法があります:最初は、明示的に並列のバージョンの内部クエリを使用します。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チーム)は、この種の問題に対処する必要がないように、クエリーを「仕事をする」ことに熱心に取り組んでいます。私たちはこれについていくつかの進歩を遂げていますが、過去数ヶ月間にいくつかのタイプのエラーが取り除かれました(例えば、最近まで内部結合が失敗してしまったなど)が、まだ方法があります。

私たちの注意を喚起してくれてありがとう。私は内部のバグを提出したので、将来この問題を改善することができます。

関連する問題