SQL Server の CROSS JOIN と FULL OUTER JOIN の違いは何ですか?
それらは同じですか?説明してください。これらのいずれかをいつ使用しますか?
SQL Server の CROSS JOIN と FULL OUTER JOIN の違いは何ですか?
それらは同じですか?説明してください。これらのいずれかをいつ使用しますか?
クロス結合は、2つのテーブル間にデカルト積を生成し、すべての行のすべての可能な組み合わせを返します。on
すべてをすべてに結合しているだけなので、句はありません。
Afull outer join
はaleft outer
とright outer
joinの組み合わせです。where
クエリの句に一致する両方のテーブルのすべての行を返し、on
それらの行の条件が満たされない場合はnull
、入力されていないフィールドに値を入力します。
このウィキペディアの記事では、さまざまなタイプの結合について、サンプルのテーブルセットを使用した出力の例とともに説明しています。
一部の人にとって必ずしも明白ではないことの 1 つは、空のテーブル (または結果セット) を使用したクロス結合の結果が空のテーブルになることです (M x N; したがって、M x 0 = 0)。
M と N の両方が 0 でない限り、完全外部結合には常に行があります。
他の回答に1つの重要な側面を追加したいと思います。これは、実際にこのトピックを最良の方法で説明してくれました。
2つの結合テーブルにM行とN行が含まれている場合、クロス結合は常に(M x N)行を生成しますが、完全外部結合はMAX(M、N)から(M + N)行を生成します(実際の行数によって異なります) 「on」述語に一致します)。
編集:
論理クエリ処理の観点から、CROSSJOINは実際に常にMxN行を生成します。FULL OUTER JOINで発生することは、LEFTとRIGHTの両方の結合が発生したかのように、左右のテーブルの両方が「保持」されることです。したがって、ON述語を満たさない行が、左右両方のテーブルから結果セットに追加されます。
返される NULL 値を除けば、これらは同じ概念です。
下記参照:
declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;
declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;
select
t1.*,
t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;
/* full outer join
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
1 11 NULL NULL
2 22 2 202
*/
select
t1.*,
t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;
/* cross join
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 2 202
1 11 10 101
2 22 2 202
2 22 10 101
*/
Cross Join : Cross Join は、2 つ以上のテーブルの行のすべての組み合わせで構成される結果を生成します。つまり、テーブル A に 3 つの行があり、テーブル B に 2 つの行がある場合、CROSS JOIN は 6 つの行になります。2 つのテーブル間に確立された関係はありません。文字通り、考えられるすべての組み合わせを生成するだけです。
Full outer Join : FULL OUTER JOIN は「左」でも「右」でもなく、両方です! これには、JOIN に参加している両方のテーブルまたは結果セットのすべての行が含まれます。JOIN の「左側」の行に一致する行が存在しない場合、「右側」の結果セットから Null 値が表示されます。逆に、JOIN の "右側" の行に一致する行が存在しない場合、"左側" の結果セットから Null 値が表示されます。
相互結合:http ://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; 2つのテーブル間のすべての可能な組み合わせを生成します(カルテシアン積)
(フル)外部結合:http ://www.w3schools.com/Sql/sql_join_full.asp
TLDR; 両方のテーブルのすべての行と、同じ値(CONDITIONで一致)を持つ結果を返します
完全外部結合は、左外部結合と右外部結合を組み合わせたものです。結果セットは、条件が満たされた場合は両方のテーブルから行を返しますが、一致しない場合は null 列を返します。
クロス結合は、テーブルを結合するための条件を必要としないデカルト積です。結果セットには、両方のテーブルの乗算である行と列が含まれます。
以下は、FULL OUTER JOIN と CROSS JOIN の両方が NULL を返さずに同じ結果セットを返す例です。FULL OUTER JOIN の ON 句の 1 = 1 に注意してください。
declare @table1 table ( col1 int, col2 int )
declare @table2 table ( col1 int, col2 int )
insert into @table1 select 1, 11 union all select 2, 22
insert into @table2 select 10, 101 union all select 2, 202
select *
from @table1 t1 full outer join @table2 t2
on 1 = 1
(影響を受ける 2 行) (影響を受ける 2 行) col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202
select *
from @table1 t1 cross join @table2 t2
col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202 (影響を受ける 4 行)