2010-07-12 235 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/