SQL Server中的CROSS JOIN和FULL OUTER JOIN的区别是什么?
它们是一样的吗?请解释一下。什么时候使用它们?
SQL Server中的CROSS JOIN和FULL OUTER JOIN的区别是什么?
它们是一样的吗?请解释一下。什么时候使用它们?
当前回答
CROSS JOIN在两个表之间产生一个笛卡尔积,返回所有行的所有可能组合。它没有ON子句,因为你只是把所有东西连接到所有东西。
FULL OUTER连接是LEFT OUTER和RIGHT OUTER连接的组合。它返回两个表中与查询的WHERE子句匹配的所有行,在这些行不能满足ON条件的情况下,它为未填充的字段放置NULL值。
这篇维基百科文章通过给出一组示例表的输出示例解释了各种类型的连接。
其他回答
交叉连接:交叉连接产生的结果由来自两个或多个表的所有行组合组成。这意味着如果表A有3行,表B有2行,那么CROSS JOIN将导致6行。这两个表之间没有建立任何关系—您实际上只是产生了每一种可能的组合。
Full outer Join:一个Full outer Join既不是“左”也不是“右”——两者都是!它包括参与JOIN的两个表或结果集中的所有行。当JOIN“左侧”的行不存在匹配行时,将看到“右侧”的结果集中的Null值。相反,当JOIN的“右侧”的行不存在匹配行时,将看到“左侧”的结果集中的Null值。
CROSS JOIN在两个表之间产生一个笛卡尔积,返回所有行的所有可能组合。它没有ON子句,因为你只是把所有东西连接到所有东西。
FULL OUTER连接是LEFT OUTER和RIGHT OUTER连接的组合。它返回两个表中与查询的WHERE子句匹配的所有行,在这些行不能满足ON条件的情况下,它为未填充的字段放置NULL值。
这篇维基百科文章通过给出一组示例表的输出示例解释了各种类型的连接。
对于某些人来说,可能不太明显的一件事是,与空表(或结果集)的交叉连接将导致空表(M x N;因此M x 0 = 0)
一个完整的外部连接总是有行,除非M和N都是0。
除了返回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
*/
SQL全外连接
FULL OUTER JOIN返回左表(table1)和右表(table2)中的所有行,而不考虑匹配情况。 FULL OUTER JOIN关键字组合了LEFT OUTER JOIN和RIGHT OUTER JOIN的结果 SQL全外部连接也称为全连接
参考资料:http://datasciencemadesimple.com/sql-full-outer-join/
SQL交叉连接
在SQL中,第一个表的每一行都映射到第二个表的每一行。 CROSS JOIN操作的结果集产生的行数等于第一个表的行数乘以第二个表的行数。 交叉连接也称为笛卡尔积/笛卡尔连接 表A的行数是m,表B的行数是n,结果表将有m*n行
参考:http://datasciencemadesimple.com/sql-cross-join/