SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?
他们是一样的吗?请解释。什么时候会使用其中任何一个?
SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?
他们是一样的吗?请解释。什么时候会使用其中任何一个?
Answers:
交叉联接在两个表之间产生笛卡尔乘积,返回所有行的所有可能组合。它没有on
子句,因为您只是将所有内容连接在一起。
A full outer join
是a left outer
和right outer
join 的组合。它返回两个表中与查询where
子句匹配的所有行,并且在on
无法满足这些行的条件的情况下,它将null
为未填充的字段放入值。
这篇Wikipedia文章解释了各种类型的联接,并给出了示例表集的输出示例。
outer join
更快还是cross join
?
我想在其他答案中添加一个重要方面,实际上以最佳方式向我解释了此主题:
如果2个联接表包含M和N行,则交叉联接将始终产生(M x N)行,但是完全外部联接将从MAX(M,N)到(M + N)行产生(取决于实际有多少行)匹配“在”谓词上)。
编辑:
从逻辑查询处理的角度来看,CROSS JOIN确实总是产生M x N行。FULL OUTER JOIN发生的情况是左表和右表都被“保留”,就好像左右连接都发生了一样。因此,来自左表和右表的行(不满足ON谓词)将添加到结果集中。
cross join
表的倍数;一个full outer join
增加他们在最坏的情况下,这取决于有多少行匹配..
对于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
)-(的行数INNER JOIN
)。
除了返回的NULL值外,它们是相同的概念。
见下文:
declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;
declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;
select
t1.*,
t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;
/* full outer join
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
1 11 NULL NULL
2 22 2 202
*/
select
t1.*,
t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;
/* cross join
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 2 202
1 11 10 101
2 22 2 202
2 22 10 101
*/
交叉加入: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中的匹配项)的结果
这是一个示例,其中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
FULL OUTER JOIN返回左表(table1)和右表(table2)的所有行,无论是否匹配。
FULL OUTER JOIN关键字结合了LEFT OUTER JOIN和RIGHT OUTER JOIN的结果
参考:http : //datasciencemadesimple.com/sql-full-outer-join/
SQL交叉联接
在SQL CROSS JOIN中,第一个表的每一行都与第二个表的每一行都映射。
CROSS JOIN操作的结果集产生的行数等于第一个表中的行数乘以第二个表中的行数。
CROSS JOIN也称为笛卡尔乘积/笛卡尔联接
表A中的行数为m,表B中的行数为n,结果表将具有m * n行
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
总是会比FROM t1,t2 WHERE t1.id=t2.id
?