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

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


当前回答

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

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

编辑:

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

其他回答

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

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

编辑:

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

对于SQL Server, CROSS JOIN和FULL OUTER JOIN是不同的。 交叉连接只是两个表的笛卡尔积,与任何过滤标准或任何条件无关。

FULL OUTER JOIN给出两个表的LEFT OUTER JOIN和RIGHT OUTER JOIN的唯一结果集。它还需要ON子句来映射两列表。

Table 1 contains 10 rows and Table 2 contains 20 rows with 5 rows matching on specific columns. Then CROSS JOIN will return 10*20=200 rows in result set. FULL OUTER JOIN will return 25 rows in result set. INNER JOIN will return matching rows, hence, 5 rows in result set. FULL OUTER JOIN (or any other JOIN) always returns result set with less than or equal to Cartesian Product number. Number of rows returned by FULL OUTER JOIN equal to (No. of Rows by LEFT OUTER JOIN) + (No. of Rows by RIGHT OUTER JOIN) - (No. of Rows by INNER JOIN).

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

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

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/

交叉加入: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中匹配)