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
10 回答
交叉连接在两个表之间生成笛卡尔积,返回所有行的所有可能组合 . 它没有
on
条款,因为你只是将所有内容都加入到了所有内容中 .full outer join
是left outer
和right outer
连接的组合 . 它返回两个表中与查询的where
子句匹配的所有行,如果这些行无法满足on
条件,则会为未填充的字段输入null
值 .这篇wikipedia文章解释了各种类型的连接,给出了一组示例表的输出示例 .
对某些人来说可能并不总是显而易见的一件事是,与空表(或结果集)的交叉连接会导致空表(M x N;因此M x 0 = 0)
除非M和N都为0,否则完整外部联接将始终具有行 .
我想在其他答案中添加一个重要方面,它以最佳方式向我解释了这个主题:
如果2个连接表包含M和N行,则交叉连接将始终产生(M x N)行,但完全外连接将从MAX(M,N)到(MN)行产生(取决于实际匹配的行数)关于“谓词” .
编辑:
从逻辑查询处理的角度来看,CROSS JOIN确实总是产生M×N行 . FULL OUTER JOIN会发生什么,左表和右表都被“保留”,好像左和右连接都发生了 . 因此,左表和右表中不满足ON谓词的行将添加到结果集中 .
交叉连接:交叉连接生成的结果包含来自两个或多个表的每个行的组合 . 这意味着如果表A有3行而表B有2行,则CROSS JOIN将产生6行 . 这两个表之间没有 Build 任何关系 - 你实际上只是产生了所有可能的组合 .
全外连接:完全外连接既不“左”也不“右” - 这两者都是!它包括参与JOIN的两个表或结果集中的所有行 . 当JOIN的“左”侧的行不存在匹配的行时,您会在“右侧”的结果集中看到Null值 . 相反,当JOIN的“右”侧的行不存在匹配行时,您会在“左侧”的结果集中看到Null值 .
对于SQL Server,
CROSS JOIN and FULL OUTER JOIN
是不同的 .CROSS JOIN
只是两个表的笛卡尔积,不论任何过滤条件或任何条件 .FULL OUTER JOIN
给出了两个表的LEFT OUTER JOIN and RIGHT OUTER JOIN
的唯一结果集 . 它还需要ON子句来映射两列表 .交叉加入: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表中的每一行,并匹配具有相同值的结果
嗨,除了返回的NULL值之外,它们是相同的概念 .
见下文:
全外连接:
此连接组合左外连接和右外连接 . 它在满足条件时从任一表返回行,并在没有匹配时返回null值 .
图片:(http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)
交叉加入:
此联接是笛卡尔联接,无需任何条件即可加入 . 结果集包含的记录是两个表中记录号的乘积 .
图片:(http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)
下面是一个示例,其中FULL OUTER JOIN和CROSS JOIN都返回相同的结果集而不返回NULL . 请注意FULL OUTER JOIN的ON子句中的1 = 1:
SQL FULL OUTER JOIN
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/