SQL Server:CROSS JOIN和FULL OUTER JOIN有什么区别?

时间:2010-07-12 13:17:11

标签: sql-server cross-join full-outer-join

SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?

它们是否相同?请解释。什么时候会使用其中任何一个?

10 个答案:

答案 0 :(得分:219)

交叉连接在两个表之间生成笛卡尔积,返回所有行的所有可能组合。它没有on条款,因为你只是将所有内容都加入到所有内容中。

full outer joinleft outerright outer联接的组合。它返回两个表中与查询的where子句匹配的所有行,如果这些行无法满足on条件,则会为未填充的字段输入null

这篇wikipedia文章解释了各种类型的连接,并给出了一组示例表的输出示例。

答案 1 :(得分:57)

对某些人来说可能并不总是显而易见的一点是,与空表(或结果集)的交叉连接会导致空表(M x N;因此M x 0 = 0)

除非M和N均为0,否则完整的外部联接将始终具有行。

答案 2 :(得分:21)

我想在其他答案中添加一个重要方面,它以最佳方式向我解释了这个主题:

如果2个连接表包含M和N行,则交叉连接将始终生成(M x N)行,但完整外连接将从MAX(M,N)到(M + N)行生成(取决于如何许多行实际上匹配“on”谓词)。

编辑:

从逻辑查询处理的角度来看,CROSS JOIN确实总是产生M×N行。 FULL OUTER JOIN会发生什么,左表和右表都被“保留”,好像左和右连接都发生了。因此,左表和右表中不满足ON谓词的行将添加到结果集中。

答案 3 :(得分:14)

交叉连接:交叉连接生成的结果包含来自两个或多个表的每个行的组合。这意味着如果表A有3行而表B有2行,则CROSS JOIN将产生6行。这两个表之间没有建立任何关系 - 你实际上只是产生了所有可能的组合。

全外连接:全外连接既不是“左”也不是“右” - 它们都是!它包括参与JOIN的两个表或结果集中的所有行。当JOIN的“左”侧的行不存在匹配的行时,您会在“右侧”的结果集中看到Null值。相反,当JOIN的“右”侧的行不存在匹配行时,您会在“左侧”的结果集中看到Null值。

答案 4 :(得分:10)

对于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的结果集。

     

FULL OUTER JOIN返回的行数等于(行数LEFT OUTER JOIN)+(行数除RIGHT OUTER JOIN) - (行数除{{1} }})。

答案 5 :(得分:5)

交叉加入:http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR:生成2个表(Carthesian产品)之间的所有可能组合

(完整)外部加入:http://www.w3schools.com/Sql/sql_join_full.asp

TLDR:返回bot表格中的每一行,并匹配那些具有相同值的结果

答案 6 :(得分:4)

除了返回的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)
*/

答案 7 :(得分:1)

全外连接:

此连接组合左外连接和右外连接。它在满足条件时从任一表返回行,并在没有匹配时返回null值。

图片:(http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg

交叉加入:

此联接是笛卡尔联接,不需要任何条件加入。结果集包含两个表中记录号相乘的记录。

图片:(http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg

答案 8 :(得分:1)

下面是一个示例,其中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 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)

答案 9 :(得分:0)

SQL FULL OUTER JOIN

  • FULL OUTER JOIN返回左表(table1)和右表(table2)中的所有行,无论匹配如何。

  • 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操作的结果集生成的行数等于第一个表中的行数乘以第二个表中的行数。

  • CROSS JOIN也称为笛卡尔积/笛卡尔联合

  • 表A中的行数是m,表B中的行数是n,结果表将有m * n行

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