web-dev-qa-db-ja.com

SQL Server:CROSS JOINとFULL OUTER JOINの違いは何ですか?

SQL ServerのCROSS JOINとFULL OUTER JOINの違いは何ですか?

それらは同じですか?説明してください。これらのいずれかをいつ使用しますか?

166
Saajid Ismail

クロス結合は、2つのテーブル間にデカルト積を生成し、すべての行のすべての可能な組み合わせを返します。 on句はありません。すべてをすべてに結合しているからです。

full outer joinは、left outerright outerの結合の組み合わせです。クエリのwhere句に一致する両方のテーブルのすべての行を返します。また、on条件がそれらの行で満たすことができない場合は、未入力フィールドにnull値を入れます。

この wikipedia の記事では、さまざまな種類の結合について、サンプルのテーブルセットが与えられた場合の出力の例を説明しています。

220
Donnie

一部の人には必ずしも明らかではないかもしれないことの1つは、空のテーブル(または結果セット)とのクロス結合が空のテーブル(M x N;したがってM x 0 = 0)になることです。

MとNの両方が0でない限り、完全外部結合には常に行があります。

57
user2292493

他の回答に重要な側面を追加したいのですが、実際にこのトピックを最良の方法で説明してくれました。

2つの結合テーブルにM行とN行が含まれる場合、クロス結合は常に(M x N)行を生成しますが、完全外部結合はMAX(M、N)から(M + N)行(実際の行数に応じて)を生成します「オン」述語に一致します)。

編集:

論理クエリ処理の観点から、CROSS JOINは実際に常にM x N行を生成します。 FULL OUTER JOINで発生することは、左と右の両方のテーブルが「保存」されていることで、左と右の両方の結合が発生したかのようです。したがって、ON述語を満たさない行は、左テーブルと右テーブルの両方から結果セットに追加されます。

21
Konstantin

クロス結合:クロス結合は、2つ以上のテーブルの行のすべての組み合わせで構成される結果を生成します。つまり、テーブルAに3行、テーブルBに2行がある場合、CROSS JOINの結果は6行になります。 2つのテーブル間に確立された関係はありません。文字通りすべての可能な組み合わせを生成します。

完全外部結合:完全外部結合は、「左」でも「右」でもありません。両方です! JOINに参加している両方のテーブルまたは結果セットのすべての行が含まれます。 JOINの「左側」の行に一致する行が存在しない場合、「右側」の結果セットからNull値が表示されます。逆に、JOINの「右側」の行に一致する行が存在しない場合、「左側」の結果セットからNull値が表示されます。

14
KuldipMCA

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による行の数)と等しい。

10
Chirag

クロス結合: http://www.dba-Oracle.com/t_garmany_9_sql_cross_join.htm

TLDR:2つのテーブル間で可能なすべての組み合わせを生成します(カルテシアン製品)

(フル)外部結合: http://www.w3schools.com/Sql/sql_join_full.asp

TLDR:ボットテーブルのすべての行を返し、同じ値を持つ結果と一致します

5
Sjuul Janssen

こんにちは、返される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)
*/
4
rio

完全外部結合:

この結合は、左外部結合と右外部結合を組み合わせます。条件が満たされた場合はいずれかのテーブルから行を返し、一致しない場合はnull値を返します。

画像:( http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg

クロス結合:

この結合は、結合するための条件を必要としないデカルト結合です。結果セットには、両方のテーブルのレコード番号の乗算であるレコードが含まれます。

画像:( http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg

1
Sujeet

以下は、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行)
1
Mo Gauvin

SQL FULL OUTER JOIN

  • FULL OUTER JOINは、一致に関係なく、左のテーブル(table1)と右のテーブル(table2)からすべての行を返します。

  • FULL OUTER JOINキーワードは、LEFT OUTER JOINとRIGHT OUTER JOINの両方の結果を組み合わせます

  • SQL完全外部結合は、FULL 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行が含まれます。

参照: http://datasciencemadesimple.com/sql-cross-join/

0
karaimadai