SQL Server:CROSS JOIN和FULL OUTER JOIN有什么区别?

Saa*_*ail 177 sql-server cross-join full-outer-join

SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?

他们是一样的,不是吗?请解释.什么时候会使用其中任何一个?

Don*_*nie 232

交叉连接在两个表之间生成笛卡尔积,返回所有行的所有可能组合.它没有任何on条款,因为你只是把一切都加入到一切.

A full outer join是a left outerright outerjoin 的组合.它返回两个表中与查询where子句匹配的所有行,如果on这些行无法满足条件,则将null值放入未填充的字段中.

这篇维基百科文章解释了各种类型的连接,给出了一组示例表的输出示例.

  • 如果我在True上完全加入怎么办?结果/表现是否与CROSS JOIN类似? (8认同)
  • @Shafizadeh - 他们做不同的事情。 (2认同)

小智 59

对某些人来说可能并不总是显而易见的一件事是,与空表(或结果集)的交叉连接会导致空表(M x N;因此M x 0 = 0)

除非M和N均为0,否则完整外部联接将始终具有行.


Kon*_*tin 27

我想在其他答案中添加一个重要方面,它以最佳方式向我解释了这个主题:

如果2个连接表包含M和N行,则交叉连接将始终产生(M x N)行,但完全外连接将从MAX(M,N)到(M + N)行产生(取决于实际的行数)匹配"on"谓词).

编辑:

从逻辑查询处理的角度来看,CROSS JOIN确实总是产生M×N行.FULL OUTER JOIN会发生什么,左表和右表都被"保留",好像左和右连接都发生了.因此,左表和右表中不满足ON谓词的行将添加到结果集中.

  • 你能回复@philipxy 的评论吗?在我看来,philipxy 是正确的,而你的答案是不正确的。似乎外部联接(甚至内部联接)可能具有多于 M+N 行(例如,True 上的联接相当于交叉联接并产生 M*N 行)。也许您的计算假设具有唯一值的列(例如主键)上的外连接?或者我错过了什么? (5认同)
  • 你是最好的真实答案。基本上:`cross join` 将表加倍;“全外连接”在最坏的情况下添加它们,具体取决于匹配的行数.. (3认同)
  • 这些界限是否排除了可能的1对多次匹配?完全外连接仍然能够产生(M×N)行. (2认同)
  • 这是错误的。FULL JOIN ON 行是 INNER JOIN ON 行 UNION ALL 不匹配的左表行进行 null 扩展 UNION ALL 不匹配的右表行进行 null 扩展。因此 FULL JOIN 可以返回 M\*N 行——可能大于 MAX(M,N) 和 M+N。但无论如何,作为 M 和 N 的函数返回的最小和最大行数*没有用*。有用的是 *FULL JOIN ON* 的清晰定义——就 INNER JOIN ON 和不匹配的行而言。 (2认同)

rio*_*rio 15

除了返回的 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
*/
Run Code Online (Sandbox Code Playgroud)

  • 很好的例子! (2认同)
  • 感谢您提供真实的数据示例。这样就更清楚了。 (2认同)

Kul*_*MCA 14

交叉连接:交叉连接生成的结果包含来自两个或多个表的每个行的组合.这意味着如果表A有3行而表B有2行,则CROSS JOIN将产生6行.这两个表之间没有建立任何关系 - 你实际上只是产生了所有可能的组合.

全外连接:完全外连接既不"左"也不"右" - 这两者都是!它包括参与JOIN的两个表或结果集中的所有行.当JOIN的"左"侧的行不存在匹配的行时,您会在"右侧"的结果集中看到Null值.相反,当JOIN的"右"侧的行不存在匹配行时,您会在"左侧"的结果集中看到Null值.


Chi*_*rag 14

For SQL Server, CROSS JOIN and FULL OUTER JOIN are different. CROSS JOIN is simply Cartesian Product of two tables, irrespective of any filter criteria or any condition.

FULL OUTER JOIN gives unique result set of LEFT OUTER JOIN and RIGHT OUTER JOIN of two tables. It also needs ON clause to map two columns of tables.

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.

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).


小智 6

SQL 全外连接

  • 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 交叉连接

  • 在 SQL CROSS JOIN 中,第一个表的每一行都与第二个表的每一行进行映射。

  • CROSS JOIN 操作结果集产生的行数等于第一个表中的行数乘以第二个表中的行数。

  • CROSS JOIN 也称为笛卡尔积/笛卡尔连接

  • 表 A 中的行数为 m,表 B 中的行数为 n,结果表将有 m*n 行

参考: http: //datasciencemadesimple.com/sql-cross-join/


Sju*_*sen 5

交叉加入: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表中的每一行,并匹配具有相同值的结果