SQL Server中的CROSS JOIN和FULL OUTER JOIN的区别是什么?
它们是一样的吗?请解释一下。什么时候使用它们?
SQL Server中的CROSS JOIN和FULL OUTER 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
*/
其他回答
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值。
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/
对于SQL Server, CROSS JOIN和FULL OUTER JOIN是不同的。 交叉连接只是两个表的笛卡尔积,与任何过滤标准或任何条件无关。
FULL OUTER JOIN给出两个表的LEFT OUTER JOIN和RIGHT OUTER JOIN的唯一结果集。它还需要ON子句来映射两列表。
Table 1 contains 10 rows and Table 2 contains 20 rows with 5 rows matching on specific columns. Then CROSS JOIN will return 10*20=200 rows in result set. FULL OUTER JOIN will return 25 rows in result set. INNER JOIN will return matching rows, hence, 5 rows in result set. FULL OUTER JOIN (or any other JOIN) always returns result set with less than or equal to Cartesian Product number. Number of rows returned by FULL OUTER JOIN equal to (No. of Rows by LEFT OUTER JOIN) + (No. of Rows by RIGHT OUTER JOIN) - (No. of Rows by 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
*/