232

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

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

4

10 に答える 10

279

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

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

このウィキペディアの記事では、さまざまなタイプの結合について、サンプルのテーブルセットを使用した出力の例とともに説明しています。

于 2010-07-12T13:21:14.197 に答える
81

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

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

于 2013-04-17T20:29:01.447 に答える
45

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

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

編集:

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

于 2011-12-20T09:17:38.603 に答える
18

返される 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
*/
于 2012-07-27T12:51:50.127 に答える
18

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

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

于 2010-07-12T13:29:28.453 に答える
6

相互結合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で一致)を持つ結果を返します

于 2010-07-12T13:24:02.840 に答える
4

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

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

于 2014-07-25T06:43:43.237 に答える
0

以下は、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 行)
于 2015-11-04T20:19:58.437 に答える