SQL Server中的CROSS JOIN和FULL OUTER 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/

其他回答

CROSS JOIN在两个表之间产生一个笛卡尔积,返回所有行的所有可能组合。它没有ON子句,因为你只是把所有东西连接到所有东西。

FULL OUTER连接是LEFT OUTER和RIGHT OUTER连接的组合。它返回两个表中与查询的WHERE子句匹配的所有行,在这些行不能满足ON条件的情况下,它为未填充的字段放置NULL值。

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

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

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

交叉加入: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;返回两个表中的每一行,以及具有相同值的结果(CONDITION中匹配)

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

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

编辑:

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

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

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