SQL ServerのCROSS JOINとFULL OUTER JOINの違いは何ですか?
それらは同じですか?説明してください。これらのいずれかをいつ使用しますか?
クロス結合は、2つのテーブル間にデカルト積を生成し、すべての行のすべての可能な組み合わせを返します。 on
句はありません。すべてをすべてに結合しているからです。
full outer join
は、left outer
とright outer
の結合の組み合わせです。クエリのwhere
句に一致する両方のテーブルのすべての行を返します。また、on
条件がそれらの行で満たすことができない場合は、未入力フィールドにnull
値を入れます。
この wikipedia の記事では、さまざまな種類の結合について、サンプルのテーブルセットが与えられた場合の出力の例を説明しています。
一部の人には必ずしも明らかではないかもしれないことの1つは、空のテーブル(または結果セット)とのクロス結合が空のテーブル(M x N;したがってM x 0 = 0)になることです。
MとNの両方が0でない限り、完全外部結合には常に行があります。
他の回答に重要な側面を追加したいのですが、実際にこのトピックを最良の方法で説明してくれました。
2つの結合テーブルにM行とN行が含まれる場合、クロス結合は常に(M x N)行を生成しますが、完全外部結合はMAX(M、N)から(M + N)行(実際の行数に応じて)を生成します「オン」述語に一致します)。
編集:
論理クエリ処理の観点から、CROSS JOINは実際に常にM x N行を生成します。 FULL OUTER JOINで発生することは、左と右の両方のテーブルが「保存」されていることで、左と右の両方の結合が発生したかのようです。したがって、ON述語を満たさない行は、左テーブルと右テーブルの両方から結果セットに追加されます。
クロス結合:クロス結合は、2つ以上のテーブルの行のすべての組み合わせで構成される結果を生成します。つまり、テーブルAに3行、テーブルBに2行がある場合、CROSS JOINの結果は6行になります。 2つのテーブル間に確立された関係はありません。文字通りすべての可能な組み合わせを生成します。
完全外部結合:完全外部結合は、「左」でも「右」でもありません。両方です! JOINに参加している両方のテーブルまたは結果セットのすべての行が含まれます。 JOINの「左側」の行に一致する行が存在しない場合、「右側」の結果セットからNull値が表示されます。逆に、JOINの「右側」の行に一致する行が存在しない場合、「左側」の結果セットからNull値が表示されます。
SQL Serverの場合、CROSS JOIN and FULL OUTER JOIN
は異なります。 CROSS JOIN
は、フィルター条件や条件に関係なく、2つのテーブルの単純なデカルト積です。
FULL OUTER JOIN
は、2つのテーブルのLEFT OUTER JOIN and RIGHT OUTER JOIN
の一意の結果セットを提供します。また、テーブルの2つの列をマップするにはON句が必要です。
表1には10行が含まれ、表2には20行が含まれ、特定の列で5行が一致します。
その後、
CROSS JOIN
は結果セットに10 * 20 = 200行を返します。
FULL OUTER JOIN
は、結果セットで25行を返します。
FULL OUTER JOIN
(または他のJOIN)は、常にCartesian Product number
以下の結果セットを返します。
FULL OUTER JOIN
によって返される行の数は、(LEFT OUTER JOIN
による行の数)+(RIGHT OUTER JOIN
による行の数)-(INNER JOIN
による行の数)と等しい。
クロス結合: http://www.dba-Oracle.com/t_garmany_9_sql_cross_join.htm
TLDR:2つのテーブル間で可能なすべての組み合わせを生成します(カルテシアン製品)
(フル)外部結合: http://www.w3schools.com/Sql/sql_join_full.asp
TLDR:ボットテーブルのすべての行を返し、同じ値を持つ結果と一致します
こんにちは、返されるNULL値以外は同じ概念です。
下記参照:
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 t1.col1 = t2.col1
/* RESULT
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
2 22 2 202
1 11 NULL NULL
(3 row(s) affected)
*/
select *
from @table1 t1 cross join @table2 t2
/* RESULT
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202
(4 row(s) affected)
*/
完全外部結合:
この結合は、左外部結合と右外部結合を組み合わせます。条件が満たされた場合はいずれかのテーブルから行を返し、一致しない場合はnull値を返します。
画像:( http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg )
クロス結合:
この結合は、結合するための条件を必要としないデカルト結合です。結果セットには、両方のテーブルのレコード番号の乗算であるレコードが含まれます。
画像:( http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg )
以下は、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行)
SQL FULL OUTER JOIN
FULL OUTER JOINは、一致に関係なく、左のテーブル(table1)と右のテーブル(table2)からすべての行を返します。
FULL OUTER JOINキーワードは、LEFT OUTER JOINとRIGHT OUTER JOINの両方の結果を組み合わせます
リファレンス: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
SQL CROSS JOINでは、最初のテーブルの各行は、2番目のテーブルのすべての行にマップされます。
CROSS JOIN操作の結果セットによって生成される行の数は、最初のテーブルの行の数に2番目のテーブルの行の数を掛けた値に等しくなります。
CROSS JOINは、デカルト積/デカルト結合とも呼ばれます
テーブルAの行数はm、テーブルBの行数はnであり、結果のテーブルにはm * n行が含まれます。