2010-07-12 342 views

回答

175

交叉連接在兩個表之間產生笛卡爾積,返回所有行的所有可能組合。它沒有on條款,因爲你只是把所有東西都加入到一切中。

A full outer joinleft outerright outer連接的組合。它返回兩個表中與查詢的where子句匹配的所有行,並且在這些行不能滿足on條件的情況下,它將null值置於未填充字段中。

這篇wikipedia文章解釋了各種類型的連接,給出了一組樣本表的輸出示例。

+0

然後,在大表 '從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

+0

@alexkovelsky內部聯接通常在兩個表之間幾乎沒有匹配時更快,因爲使用索引意味着它不會讀取其中一個表上的所有行。完整的外連接必須始終讀取兩個表(或相關索引)中的所有行。在索引不足的情況下,或者必須讀取底層堆以輸出所需的列時,完整的外連接總是比內連接慢。 – 2014-09-10 00:27:19

+0

'外部連接'更快或'交叉連接'? – Shafizadeh 2016-05-11 13:19:29

14

交叉連接:交叉連接產生由兩個或多個表中各行組成的結果。這意味着如果表A有3行並且表B有2行,則CROSS JOIN將導致6行。這兩張表格之間並沒有建立任何關係 - 你的字面意思就是產生每種可能的組合。

Full outer Join:全外連接既不是「左」也非「右」 - 它們都是!它包括來自兩個表或參與JOIN的結果集的所有行。當JOIN的「左」側上的行不存在匹配行時,您會在「右側」看到結果集中的空值。相反,當JOIN的「右側」行上不存在匹配的行時,您會在「左側」看到結果集中的空值。

16

我想一個重要的方面添加到其他的答案,這實際上最好的方式解釋了這個話題對我說:

如果2連接表包含M和N行,然後CROSS JOIN總是會產生( M×N)個行,但完全外連接將從MAX(M,N)到(M + N)行產生(取決於多少行實際匹配「on」謂詞)。

編輯:

從邏輯查詢處理的角度來看,CROSS JOIN確實總是產生M×N個行。 FULL OUTER JOIN會發生什麼情況,左右表都是「保留」的,就好像左側和右側連接一樣。因此,從左右兩個表中將不滿足ON謂詞的行添加到結果集中。

+2

這些邊界是否排除可能的一對多匹配?全外連接仍然能夠產生(M×N)行。 – maxwellb 2012-10-23 19:13:54

+1

選擇COUNT_BIG(\ *) FROM交通噸CROSS JOIN收件人ř 和 SELECT COUNT_BIG(\ *) FROM交通噸FULL JOIN收件人R ON(1 = 1) 它們是相同的。 – urlreader 2013-09-20 21:02:42

+1

你是最好的答案。基本上來說:一個「交叉連接」將表格倍增;一個'全外連接'在最壞的情況下添加它們,這取決於有多少行匹配。 – 2014-06-11 07:30:32

3

嗨他們是相同的概念,除了返回的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) 
*/ 
44

一件事,可能並不總是明顯的一些是橫一個空表連接(或結果集)在空表的結果(M×N個;因此一M× 0 = 0)

完全外部連接將總是具有行,除非兩個M和N是0

+0

添加泛化,交叉連接始終具有MxN結果。雖然外連接的結果行在[(M + N),MxN]的範圍內,但實際行數也取決於數據集和ON條件。 – 2017-11-01 18:23:31

6

對於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行數)返回的行

數目。

1

下面是一個例子,其中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) 
0

SQL FULL OUTER JOIN

  • 完全外部JOIN返回左表(table1)和右表中的所有行(表2),無論匹配。

  • 的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中,第一個表的每一行都與第二個表的每一行進行映射。

  • CROSS JOIN操作的結果集生成的行數等於第一個表中的行數乘以第二個表中的行數。

  • 交叉連接也稱爲笛卡爾乘積/笛卡爾加入

  • 的行數在表A中爲m,在表B中的行數是n,並且所得的表將具有m * n個行

參考:http://datasciencemadesimple.com/sql-cross-join/