必ずしもそうではありません。あなたの質問は同等です。しかし、WHERE t1.id = t2.id AND t2.id = t3.id
がなければ、それはCROSS JOIN
になります。
更新:
これは興味深い質問だと私はいくつかのデモを追加することにしました。 2つのテーブルを作成しましょう:
A(c1 int, c2 string)
およびB(c1 int, c2 string)
です。
負荷データ:
insert into table A
select 1, 'row one' union all
select 2, 'row two';
insert into table B
select 1, 'row one' union all
select 3, 'row three';
チェックデータ:
hive> select * from A;
OK
1 row one
2 row two
Time taken: 1.29 seconds, Fetched: 2 row(s)
hive> select * from B;
OK
1 row one
3 row three
Time taken: 0.091 seconds, Fetched: 2 row(s)
チェッククロス(暗黙が交差するように形質転換where
ことなく結合)に参加:
hive> select a.c1, a.c2, b.c1, b.c2 from a,b;
Warning: Map Join MAPJOIN[14][bigTable=a] in task 'Stage-3:MAPRED' is a cross product
Warning: Map Join MAPJOIN[22][bigTable=b] in task 'Stage-4:MAPRED' is a cross product
Warning: Shuffle Join JOIN[4][tables = [a, b]] in Stage 'Stage-1:MAPRED' is a cross product
OK
1 row one 1 row one
2 row two 1 row one
1 row one 3 row three
2 row two 3 row three
Time taken: 54.804 seconds, Fetched: 4 row(s)
内部結合10
チェック(暗黙のインナーとしてwhere
作品で参加):
hive> select a.c1, a.c2, b.c1, b.c2 from a,b where (a.c1=b.c1) OR (b.c1 is null);
OK
1 row one 1 row one
Time taken: 57.317 seconds, Fetched: 1 row(s)
することができますように:
hive> select a.c1, a.c2, b.c1, b.c2 from a,b where a.c1=b.c1;
OK
1 row one 1 row one
Time taken: 38.413 seconds, Fetched: 1 row(s)
どこにOR b.c1 is null
を追加することにより、参加左を実行するようにしてください私たちは再び内部の結合を参照してください。 or b.c1 is null
は(CROSSに変換)where
とON
句を使用せずに今すぐleft join
を無視されます。
select a.c1, a.c2, b.c1, b.c2 from a left join b;
OK
1 row one 1 row one
1 row one 3 row three
2 row two 1 row one
2 row two 3 row three
Time taken: 37.104 seconds, Fetched: 4 row(s)
あなたは私たちが再び交差だ見ることができるように。
where
句とON
なし(INNERとして働く)と結合左試してみてください:
select a.c1, a.c2, b.c1, b.c2 from a left join b where a.c1=b.c1;
OK
1 row one 1 row one
Time taken: 40.617 seconds, Fetched: 1 row(s)
私たちは、INNERがwhere
句でとON
+なしで参加左を試してみてください
に参加しましたnullを許可してください:
select a.c1, a.c2, b.c1, b.c2 from a left join b where a.c1=b.c1 or b.c1 is null;
OK
1 row one 1 row one
Time taken: 53.873 seconds, Fetched: 1 row(s)
もう一度INNERを取得しました。またはb.c1 is null
は無視されます。
左on
節のあるJOIN:
hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1;
OK
1 row one 1 row one
2 row two NULL NULL
Time taken: 48.626 seconds, Fetched: 2 row(s)
はい、それは真左で参加します。
左on
+ where
(INNERを得た)と結合:
hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1 where a.c1=b.c1;
OK
1 row one 1 row one
Time taken: 49.54 seconds, Fetched: 1 row(s)
WHEREはNULLSを許可していないので、我々はINNERました。
左はNULLを許可ところ+と結合:
hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1 where a.c1=b.c1 or b.c1 is null;
OK
1 row one 1 row one
2 row two NULL NULL
Time taken: 55.951 seconds, Fetched: 2 row(s)
はい、参加残っています。
結論: 句がなければ
- 暗黙は中わた(有する)またはクロスのような作品に参加します。
- WHERE句でNULLが許可されていない場合、ON結合なしでWHEREを使用しない場合、左結合はCROSSとして機能し、WHERE句ではNULLを使用できない場合は テーブル用に テーブルを使用できます。
- これは自己説明的なものであり、どのような動作が期待されるのかが分かりやすいため、ANSI構文を使用する方が効果的です。 INNERまたはCROSSとして機能する暗黙的な結合または左結合は、理解するのが難しく、エラーが発生しやすくなります。
さらに複雑なクエリを取得すると、ついにこれに戻りました。非常にクールな動作の文書化。 –
これらの複雑なデモは、インナージョインとレフトジョインの作成方法を知っているほど明確です。本当にありがとう! – Xiao