SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?
它们是否相同?请解释。什么时候会使用其中任何一个?
答案 0 :(得分:219)
交叉连接在两个表之间生成笛卡尔积,返回所有行的所有可能组合。它没有on
条款,因为你只是将所有内容都加入到所有内容中。
full outer join
是left outer
和right 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的结果
参考:http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
在SQL CROSS JOIN第一个表的每一行都映射到第二个表的每一行。
CROSS JOIN操作的结果集生成的行数等于第一个表中的行数乘以第二个表中的行数。
CROSS JOIN也称为笛卡尔积/笛卡尔联合
表A中的行数是m,表B中的行数是n,结果表将有m * n行