SQL Server:CROSS JOIN和FULL OUTER JOIN有什么不同?
SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?
他们是一样的还是不一样? 请解释。 什么时候会使用这些?
交叉连接在两个表之间产生笛卡尔积,返回所有行的所有可能的组合。 它没有条款,因为你只是把所有东西都join到一切中。
full outer join
是left outer
和right outer
连接的组合。 它返回两个表中与查询的where
子句匹配的所有行,并且在on
条件不能满足这些行的情况下,它将null
值填入未填充的字段。
这个维基百科文章解释了各种types的连接与输出的例子给出了一组样本表。
有些事情可能并不总是显而易见的,那就是用空表(或结果集)进行交叉连接会导致空表(M x N;因此M x 0 = 0)
除非M和N都为0,否则完整的外连接总是有行。
我想在其他答案中增加一个重要的方面,这实际上是以最好的方式向我解释这个话题:
如果两个连接的表包含M行和N行,那么交叉连接将始终生成(M×N)行,但是完全外部连接将从MAX(M,N)到(M + N)行生成(取决于实际有多less行匹配“上”谓词)。
编辑:
从逻辑查询处理的angular度来看,CROSS JOIN确实总是产生M×N行。 FULL OUTER JOIN会发生什么情况,左右表都是“保留”的,就好像左右连接一样。 因此,从左右两个表中不满足ON谓词的行都被添加到结果集中。
交叉连接(Cross join):交叉连接(Cross Joins)产生由两个或更多表格的行组成的结果。 这意味着如果表A有3行,而表B有2行,则CROSS JOIN将导致6行。 这两张表之间并没有build立任何关系 – 你简直就是生产出所有可能的组合。
全外连接:全外连接既不是“左”也不是“正确” – 它们都是! 它包含来自两个表或参与JOIN的结果集的所有行。 当JOIN的“左”侧上的行不存在匹配的行时,将在“右侧”看到结果集中的空值。 相反,当JOIN的“右”侧上的行不存在匹配的行时,将在“左侧”看到结果集中的空值。
对于SQL Server, CROSS JOIN and FULL OUTER JOIN
是不同的。 CROSS JOIN
简单地说就是两个表的笛卡尔乘积,而不pipe任何过滤条件或任何条件。
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
的行数) – (INNER JOIN
的行数)。
交叉join: http : //www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR:生成2个表格之间的所有可能组合(Carthesian产品)
(Full)外部join: http : //www.w3schools.com/Sql/sql_join_full.asp
TLDR:返回bot表中的每一行,并匹配具有相同值的结果
嗨,他们是相同的概念,除了返回的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) */
全外连接:
这个连接结合了左外连接和右外连接。 当条件满足时它从任一表中返回行,当不匹配时返回空值。
图片:( http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg )
交叉join:
这个连接是一个笛卡儿连接,不需要任何条件join。 结果集包含两个表中logging号相乘的logging。
图片:( http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg )
下面是一个例子,其中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排受影响) (2排受影响) 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排受影响)
SQL全外连接
-
无论匹配如何,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/