SQL ServerのCROSS JOINとFULL OUTER JOINの違いは何ですか?
それらは同じですか?説明してください。いつこれらのいずれかを使用しますか?
SQL ServerのCROSS JOINとFULL OUTER JOINの違いは何ですか?
それらは同じですか?説明してください。いつこれらのいずれかを使用しますか?
回答:
クロス結合は、2つのテーブル間にデカルト積を生成し、すべての行のすべての可能な組み合わせを返します。on
すべてをすべてに結合しているだけなので、条項はありません。
A full outer join
はa left outer
とright outer
joinの組み合わせです。クエリのwhere
句に一致する両方のテーブルのすべての行を返します。これらの行でon
条件が満たされない場合はnull
、未入力フィールドに値を入力します。
このウィキペディアの記事では、さまざまな種類の結合について、サンプルのテーブルセットが指定された場合の出力例とともに説明しています。
outer join
速いですかcross join
?
空のテーブル(または結果セット)とのクロス結合が空のテーブル(M x N;したがってM x 0 = 0)になることが常にあるとは限りません。
MとNの両方が0でない限り、完全外部結合には常に行があります。
他の回答に1つの重要な側面を追加したいと思います。実際には、このトピックを最良の方法で説明してくれました。
2つの結合されたテーブルにM行とN行が含まれている場合、クロス結合は常に(M x N)行を生成しますが、完全外部結合はMAX(M、N)から(M + N)行を生成します(実際の行数によって異なります) 「on」述語に一致します)。
編集:
論理クエリ処理の観点から見ると、CROSS JOINは実際に常にM x N行を生成します。FULL OUTER JOINで発生するのは、LEFT結合とRIGHT結合の両方が発生したかのように、左と右の両方のテーブルが「保持」されることです。そのため、ON述部を満たさない、左と右の両方のテーブルからの行が結果セットに追加されます。
cross join
テーブルの倍数。full outer join
...一致行数に応じて、最悪の場合には、それらを追加
クロス結合:クロス結合は、2つ以上のテーブルの行のすべての組み合わせで構成される結果を生成します。つまり、テーブルAに3つの行があり、テーブルBに2つの行がある場合、CROSS JOINは6行になります。2つのテーブル間に確立された関係はありません。文字通りすべての可能な組み合わせを作成するだけです。
完全外部結合:FULL OUTER JOINは「左」でも「右」でもありません。両方です。これには、JOINに参加している両方のテーブルまたは結果セットのすべての行が含まれます。JOINの「左側」の行に一致する行が存在しない場合、「右側」に結果セットのNull値が表示されます。逆に、JOINの「右側」の行に一致する行が存在しない場合、「左側」の結果セットからNull値が表示されます。
SQL Serverの場合CROSS JOIN and FULL OUTER JOIN
は異なります。
CROSS JOIN
フィルター基準や条件に関係なく、2つのテーブルの単純なデカルト積です。
FULL OUTER JOIN
LEFT OUTER JOIN and RIGHT OUTER JOIN
2つのテーブルの一意の結果セットを提供します。テーブルの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 byLEFT OUTER JOIN
)+(No. of Rows byRIGHT OUTER JOIN
)-(No. of Rows byINNER JOIN
)に等しい行数
返される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
*/
クロス結合: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で一致)
次に、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行になります
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
は常により速くなりFROM t1,t2 WHERE t1.id=t2.id
ますか?