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


回答:


243

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

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

このウィキペディアの記事では、さまざまな種類の結合について、サンプルのテーブルセットが指定された場合の出力例とともに説明しています。


次に、大きなテーブルの場合 FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id は常により速くなり FROM t1,t2 WHERE t1.id=t2.idますか?
alexkovelsky 2014

@alexkovelskyの内部結合は、2つのテーブル間で一致がほとんどない場合に高速になることがよくあります。これは、インデックスを使用すると、いずれかのテーブルのすべての行を読み取らなくても済むためです。完全外部結合は常に両方のテーブル(または関連するインデックス)のすべての行を読み取る必要があります。インデックスが十分でない場合、または必要な列を出力するために基礎となるヒープを読み取る必要がある場合、完全外部結合は、ほとんど常に内部結合よりも低速です。
Andrew Hill

1
あるouter join速いですかcross join
Shafizadeh 2016年

2
@Shafizadeh-彼らは異なることをします。
ドニー

9
Trueで完全外部結合するとどうなりますか?結果/パフォーマンスはCROSS JOINに似ていますか?
建築家、

65

空のテーブル(または結果セット)とのクロス結合が空のテーブル(M x N;したがってM x 0 = 0)になることが常にあるとは限りません。

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


32

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

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

編集:

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


2
それらの境界は、可能な1対多の一致を除外していますか?完全外部結合は(M x N)行を生成できます。
maxwellb 2012年

1
SELECT COUNT_BIG(*)FROMトラフィックt CROSS JOIN受信者rとSELECT COUNT_BIG(*)FROMトラフィックt FULL JOIN受信者r ON(1 = 1)は同じです。
urlreader 2013

2
あなたの答えが一番です。基本的に:cross joinテーブルの倍数。full outer join...一致行数に応じて、最悪の場合には、それらを追加
ブライアン・ピーターソン

はい。私はこの数学を探していました-MAX(M、N)から(M + N)行までのプロデュース ..投票していただきありがとうございます。
Arup Rakshit、2015

1
これは間違っています。FULL JOIN ONの行は、INNER JOIN ONの行です。したがって、FULL JOINはM * N行を返す可能性があります-MAX(M、N)とM + Nの両方よりも大きい可能性があります。ただし、とにかく、M&Nの関数として返される行の最小数と最大数は役に立たないだけです。有用なのは、FULL JOIN ONの明確な定義です。これは、INNER JOIN ONと一致しない行の観点からです。
philipxy

15

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

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


15

SQL Serverの場合CROSS JOIN and FULL OUTER JOINは異なります。 CROSS JOINフィルター基準や条件に関係なく、2つのテーブルの単純なデカルト積です。

FULL OUTER JOINLEFT OUTER JOIN and RIGHT OUTER JOIN2つのテーブルの一意の結果セットを提供します。テーブルの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(No. of Rows by LEFT OUTER JOIN)+(No. of Rows by RIGHT OUTER JOIN)-(No. of Rows by INNER JOIN)に等しい行数


8

返される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
*/

1
素晴らしい例!
Lucas925

1
実際のデータの例をありがとう。それはそれをより明確にします。
dtc


2

完全外部結合は、左外部結合と右外部結合を組み合わせたものです。結果セットは、条件が満たされている両方のテーブルから行を返しますが、一致がない場合はnull列を返します。

クロス結合は、テーブルを結合するための条件を必要としないデカルト積です。結果セットには、両方のテーブルの乗算である行と列が含まれています。


1

次に、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

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/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.