SQL Server中CROSS JOIN和FULL OUTER JOIN有什麼區別?SQL Server:CROSS JOIN和FULL OUTER JOIN有什麼區別?
它們是否相同?請解釋。什麼時候會使用這些?
SQL Server中CROSS JOIN和FULL OUTER JOIN有什麼區別?SQL Server:CROSS JOIN和FULL OUTER JOIN有什麼區別?
它們是否相同?請解釋。什麼時候會使用這些?
交叉連接在兩個表之間產生笛卡爾積,返回所有行的所有可能組合。它沒有on
條款,因爲你只是把所有東西都加入到一切中。
A full outer join
是left outer
和right outer
連接的組合。它返回兩個表中與查詢的where
子句匹配的所有行,並且在這些行不能滿足on
條件的情況下,它將null
值置於未填充字段中。
這篇wikipedia文章解釋了各種類型的連接,給出了一組樣本表的輸出示例。
交叉聯接:http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR:http://www.w3schools.com/Sql/sql_join_full.asp
TLDR:返回每一行的BOT桌和2個表(Carthesian產品)
(全)外部聯接之間生成一個所有可能的組合匹配具有相同值的結果
交叉連接:交叉連接產生由兩個或多個表中各行組成的結果。這意味着如果表A有3行並且表B有2行,則CROSS JOIN將導致6行。這兩張表格之間並沒有建立任何關係 - 你的字面意思就是產生每種可能的組合。
Full outer Join:全外連接既不是「左」也非「右」 - 它們都是!它包括來自兩個表或參與JOIN的結果集的所有行。當JOIN的「左」側上的行不存在匹配行時,您會在「右側」看到結果集中的空值。相反,當JOIN的「右側」行上不存在匹配的行時,您會在「左側」看到結果集中的空值。
我想一個重要的方面添加到其他的答案,這實際上最好的方式解釋了這個話題對我說:
如果2連接表包含M和N行,然後CROSS JOIN總是會產生( M×N)個行,但完全外連接將從MAX(M,N)到(M + N)行產生(取決於多少行實際匹配「on」謂詞)。
編輯:
從邏輯查詢處理的角度來看,CROSS JOIN確實總是產生M×N個行。 FULL OUTER JOIN會發生什麼情況,左右表都是「保留」的,就好像左側和右側連接一樣。因此,從左右兩個表中將不滿足ON謂詞的行添加到結果集中。
嗨他們是相同的概念,除了返回的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)
*/
一件事,可能並不總是明顯的一些是橫一個空表連接(或結果集)在空表的結果(M×N個;因此一M× 0 = 0)
完全外部連接將總是具有行,除非兩個M和N是0
添加泛化,交叉連接始終具有MxN結果。雖然外連接的結果行在[(M + N),MxN]的範圍內,但實際行數也取決於數據集和ON條件。 – 2017-11-01 18:23:31
全外連接:
此加入聯合左外連接和右外淳佳ñ。當條件滿足時,它從任一表中返回行,當不匹配時返回空值。
圖像:(http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)
交叉聯接:
此連接笛卡爾加入不必要任何條件加入。結果集包含兩個表中記錄號相乘的記錄。
圖像:(http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)
對於SQL Server,CROSS JOIN and FULL OUTER JOIN
是不同的。 CROSS JOIN
只是兩張表的笛卡爾乘積,不管任何過濾條件或任何條件。
FULL OUTER JOIN
給出了兩個表的唯一結果集LEFT OUTER JOIN and RIGHT OUTER JOIN
。它還需要ON子句來映射兩列表。
表1包含10行,表2包含20行,5行與特定列匹配。
然後
CROSS JOIN
將在結果集中返回10 * 20 = 200行。
FULL OUTER JOIN
將返回結果集中的25行。
FULL OUTER JOIN
(或任何其他JOIN)總是返回小於或等於Cartesian Product number
的結果集。 (由INNER JOIN
行數) - 由FULL OUTER JOIN
等於(由LEFT OUTER JOIN
排數)+(由RIGHT OUTER JOIN
行數)返回的行數目。
下面是一個例子,其中FULL OUTER JOIN和CROSS JOIN返回相同的結果集,但不返回NULL。請注意,完全外部的ON子句中的1 = 1 JOIN:
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 row(s) affected) (2 row(s) affected) 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 row(s) affected)
SQL FULL OUTER JOIN
完全外部JOIN返回左表(table1)和右表中的所有行(表2),無論匹配。
的FULL OUTER JOIN關鍵字結合了兩種LEFT OUTER JOIN和RIGHT OUTER JOIN
參考結果:http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
在SQL CROSS JOIN中,第一個表的每一行都與第二個表的每一行進行映射。
CROSS JOIN操作的結果集生成的行數等於第一個表中的行數乘以第二個表中的行數。
交叉連接也稱爲笛卡爾乘積/笛卡爾加入
的行數在表A中爲m,在表B中的行數是n,並且所得的表將具有m * n個行
然後,在大表 '從T1 FULL OUTER的情況下JOIN T2 ON t1.id = t2.id' 總是比 更快'FROM T1,T2 WHE RE t1.id = t2.id' ? – alexkovelsky 2014-08-20 08:29:51
@alexkovelsky內部聯接通常在兩個表之間幾乎沒有匹配時更快,因爲使用索引意味着它不會讀取其中一個表上的所有行。完整的外連接必須始終讀取兩個表(或相關索引)中的所有行。在索引不足的情況下,或者必須讀取底層堆以輸出所需的列時,完整的外連接總是比內連接慢。 – 2014-09-10 00:27:19
'外部連接'更快或'交叉連接'? – Shafizadeh 2016-05-11 13:19:29