SQL Server中CROSS JOIN和FULL OUTER JOIN有什么区别?SQL Server:CROSS JOIN和FULL OUTER JOIN有什么区别?
它们是否相同?请解释。什么时候会使用这些?
SQL Server中CROSS JOIN和FULL OUTER JOIN有什么区别?SQL Server:CROSS JOIN和FULL OUTER JOIN有什么区别?
它们是否相同?请解释。什么时候会使用这些?
交叉连接在两个表之间产生笛卡尔积,返回所有行的所有可能组合。它没有on
条款,因为你只是把所有东西都加入到一切中。
A full outer join
是left outer
和right outer
连接的组合。它返回两个表中与查询的where
子句匹配的所有行,并且在这些行不能满足on
条件的情况下,它将null
值置于未填充字段中。
这篇wikipedia文章解释了各种类型的连接,给出了一组样本表的输出示例。
交叉联接:http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR:http://www.w3schools.com/Sql/sql_join_full.asp
TLDR:返回每一行的BOT桌和2个表(Carthesian产品)
(全)外部联接之间生成一个所有可能的组合匹配具有相同值的结果
交叉连接:交叉连接产生由两个或多个表中各行组成的结果。这意味着如果表A有3行并且表B有2行,则CROSS JOIN将导致6行。这两张表格之间并没有建立任何关系 - 你的字面意思就是产生每种可能的组合。
Full outer Join:全外连接既不是“左”也非“右” - 它们都是!它包括来自两个表或参与JOIN的结果集的所有行。当JOIN的“左”侧上的行不存在匹配行时,您会在“右侧”看到结果集中的空值。相反,当JOIN的“右侧”行上不存在匹配的行时,您会在“左侧”看到结果集中的空值。
我想一个重要的方面添加到其他的答案,这实际上最好的方式解释了这个话题对我说:
如果2连接表包含M和N行,然后CROSS JOIN总是会产生( M×N)个行,但完全外连接将从MAX(M,N)到(M + N)行产生(取决于多少行实际匹配“on”谓词)。
编辑:
从逻辑查询处理的角度来看,CROSS JOIN确实总是产生M×N个行。 FULL OUTER JOIN会发生什么情况,左右表都是“保留”的,就好像左侧和右侧连接一样。因此,从左右两个表中将不满足ON谓词的行添加到结果集中。
嗨他们是相同的概念,除了返回的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)
*/
一件事,可能并不总是明显的一些是横一个空表连接(或结果集)在空表的结果(M×N个;因此一M× 0 = 0)
完全外部连接将总是具有行,除非两个M和N是0
添加泛化,交叉连接始终具有MxN结果。虽然外连接的结果行在[(M + N),MxN]的范围内,但实际行数也取决于数据集和ON条件。 – 2017-11-01 18:23:31
全外连接:
此加入联合左外连接和右外淳佳ñ。当条件满足时,它从任一表中返回行,当不匹配时返回空值。
图像:(http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)
交叉联接:
此连接笛卡尔加入不必要任何条件加入。结果集包含两个表中记录号相乘的记录。
图像:(http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)
对于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
的结果集。 (由INNER JOIN
行数) - 由FULL OUTER JOIN
等于(由LEFT OUTER JOIN
排数)+(由RIGHT OUTER JOIN
行数)返回的行数目。
下面是一个例子,其中FULL OUTER JOIN和CROSS JOIN返回相同的结果集,但不返回NULL。请注意,完全外部的ON子句中的1 = 1 JOIN:
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)
SQL FULL OUTER JOIN
完全外部JOIN返回左表(table1)和右表中的所有行(表2),无论匹配。
的FULL OUTER JOIN关键字结合了两种LEFT OUTER JOIN和RIGHT OUTER JOIN
参考结果:http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
在SQL CROSS JOIN中,第一个表的每一行都与第二个表的每一行进行映射。
CROSS JOIN操作的结果集生成的行数等于第一个表中的行数乘以第二个表中的行数。
交叉连接也称为笛卡尔乘积/笛卡尔加入
的行数在表A中为m,在表B中的行数是n,并且所得的表将具有m * n个行
然后,在大表 '从T1 FULL OUTER的情况下JOIN T2 ON t1.id = t2.id' 总是比 更快'FROM T1,T2 WHE RE t1.id = t2.id' ? – alexkovelsky 2014-08-20 08:29:51
@alexkovelsky内部联接通常在两个表之间几乎没有匹配时更快,因为使用索引意味着它不会读取其中一个表上的所有行。完整的外连接必须始终读取两个表(或相关索引)中的所有行。在索引不足的情况下,或者必须读取底层堆以输出所需的列时,完整的外连接总是比内连接慢。 – 2014-09-10 00:27:19
'外部连接'更快或'交叉连接'? – Shafizadeh 2016-05-11 13:19:29