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

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

它们是一样的吗?请解释一下。什么时候使用它们?

285145 次浏览

交叉连接在两个表之间产生一个笛卡尔积,返回所有行的所有可能组合。它没有on子句,因为你只是将所有元素连接到所有元素。

full outer joinleft outerright outer连接的组合。它返回两个表中与查询的where子句匹配的所有行,在那些行不能满足on条件的情况下,它为未填充的字段放入null值。

这篇维基百科文章通过给出一组示例表的输出示例解释了各种类型的连接。

交叉连接: http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR;生成两个表之间所有可能的组合(Carthesian积)

(满)外部连接: http://www.w3schools.com/Sql/sql_join_full.asp

TLDR;返回两个表中的每一行,以及具有相同值的结果(条件匹配)

交叉连接:交叉连接产生的结果由来自两个或多个表的所有行组合组成。这意味着如果表A有3行,表B有2行,那么CROSS JOIN将导致6行。这两个表之间没有建立任何关系—您实际上只是产生了每一种可能的组合。

Full outer Join:一个Full outer Join既不是“左”也不是“右”——两者都是!它包括参与JOIN的两个表或结果集中的所有行。当JOIN“左侧”的行不存在匹配行时,将看到“右侧”的结果集中的Null值。相反,当JOIN的“右侧”的行不存在匹配行时,将看到“左侧”的结果集中的Null值。

我想在其他答案中补充一个重要的方面,它实际上以最好的方式向我解释了这个主题:

如果2个连接的表包含M和N行,那么交叉连接将始终生成(M x N)行,但完全外部连接将生成MAX(M,N)到(M + N)行(取决于实际匹配“on”谓词的行数)。

编辑:

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

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

对于某些人来说,可能不太明显的一件事是,与空表(或结果集)的交叉连接将导致空表(M x N;因此M x 0 = 0)

一个完整的外部连接总是有行,除非M和N都是0。

完全外部连接组合了左外部连接和右外部连接。结果集从满足条件的两个表中返回行,但在不匹配的地方返回空列。

交叉连接是一个笛卡儿积,它不需要任何条件来连接表。结果集包含的行和列是两个表的乘法。

对于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行。 INNER JOIN将返回匹配的行,因此结果集中有5行

FULL OUTER JOIN(或任何其他JOIN)总是返回小于或等于Cartesian Product number的结果集。

FULL OUTER JOIN返回的行数等于(No。of Rows by LEFT OUTER JOIN) + (No。of Rows by RIGHT OUTER JOIN) - (No。INNER JOIN)。

SQL全外连接

  • FULL OUTER JOIN返回左表(table1)和右表(table2)中的所有行,而不考虑匹配情况。

  • FULL OUTER JOIN关键字组合了LEFT OUTER JOIN和RIGHT OUTER JOIN的结果

  • SQL全外部连接也称为全连接

参考:http://datasciencemadesimple.com/sql-full-outer-join/

SQL交叉连接

  • 在SQL中,第一个表的每一行都映射到第二个表的每一行。

  • CROSS JOIN操作的结果集产生的行数等于第一个表的行数乘以第二个表的行数。

  • 交叉连接也称为笛卡尔积/笛卡尔连接

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

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