对于SQL Server,CROSS JOIN and FULL OUTER JOIN是不同的。CROSS JOIN只是两个表的笛卡尔乘积,与任何筛选条件或任何条件无关。 FULL OUTER JOIN给出LEFT OUTER JOIN and RIGHT OUTER JOIN的两个表唯一的结果集,也需要ON子句Map表的两列。 表1包含10行,表2包含20行,其中5行匹配特定列。 那么CROSS JOIN将在结果集中返回10*20=200行。 FULL OUTER JOIN将在结果集中返回25行。INNER JOIN将返回匹配的行,因此在结果集中返回5行。 FULL OUTER JOIN(或任何其他JOIN)始终返回小于或等于Cartesian Product number的结果集。 FULL OUTER JOIN返回的行数等于(LEFT OUTER JOIN的行数)+(RIGHT OUTER JOIN的行数)-(INNER JOIN的行数)。
9条答案
按热度按时间gcmastyq1#
CROSS JOIN
在两个表之间产生一个笛卡尔积,返回所有行的所有可能组合,它没有ON
子句,因为你只是把所有的东西连接到所有的东西。FULL OUTER JOIN
是LEFT OUTER
和RIGHT OUTER
联接的组合。它返回两个表中与查询的WHERE
子句匹配的所有行,如果这些行不能满足ON
条件,它将为未填充的字段放入NULL
值。这篇wikipedia文章解释了各种类型的连接,并给出了一组示例表的输出示例。
a0x5cqrl2#
有一件事对某些人来说可能并不总是显而易见的,那就是与空表(或结果集)的交叉连接会导致空表(M x N;因此M x 0 = 0)
除非M和N都为0,否则完全外部联接将始终包含行。
eivgtgni3#
我想补充一个重要的方面,其他答案,实际上解释了这个主题给我最好的方式:
如果2个连接的表包含M和N行,则交叉连接将始终生成(M x N)行,但完全外部连接将生成MAX(M,N)到(M + N)行(取决于实际匹配"on" predicate 的行数)。
编辑:
从逻辑查询处理的Angular 来看,CROSS JOIN确实总是生成M x N行。使用FULL OUTER JOIN时,左表和右表都被"保留",就好像左连接和右连接都发生了一样。因此,左表和右表中不满足ON predicate 的行都被添加到结果集中。
hkmswyz64#
对于SQL Server,
CROSS JOIN and FULL OUTER JOIN
是不同的。CROSS JOIN
只是两个表的笛卡尔乘积,与任何筛选条件或任何条件无关。FULL OUTER JOIN
给出LEFT OUTER JOIN and RIGHT OUTER JOIN
的两个表唯一的结果集,也需要ON子句Map表的两列。表1包含10行,表2包含20行,其中5行匹配特定列。
那么
CROSS JOIN
将在结果集中返回10*20=200行。FULL OUTER JOIN
将在结果集中返回25行。INNER JOIN
将返回匹配的行,因此在结果集中返回5行。FULL OUTER JOIN
(或任何其他JOIN)始终返回小于或等于Cartesian Product number
的结果集。FULL OUTER JOIN
返回的行数等于(LEFT OUTER JOIN
的行数)+(RIGHT OUTER JOIN
的行数)-(INNER JOIN
的行数)。ltskdhd15#
除了返回NULL值外,它们是相同的概念。
见下文:
bfhwhh0e6#
交叉联接:交叉联接生成的结果由两个或多个表中的每种行组合组成。这意味着,如果表A有3行,表B有2行,则交叉联接将生成6行。这两个表之间没有建立关系-您实际上只是生成每种可能的组合。
完全外部联接:FULL OUTER JOIN既不是“左”也不是“右”,而是两者都是!它包括参与JOIN的两个表或结果集中的所有行。当JOIN“左”侧的行不存在匹配行时,您将看到“右”侧的结果集中的Null值。相反,当JOIN“右”侧的行不存在匹配行时,您会在“左侧”看到结果集中的空值。
polkgigr7#
交叉连接:http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
**TLDR;**生成2个表之间的所有可能组合(Cartesian乘积)
(完全)外部联接:http://www.w3schools.com/Sql/sql_join_full.asp
**TLDR;**返回两个表中的每一行以及具有相同值的结果(在CONDITION中匹配)
8oomwypt8#
参考:http://datasciencemadesimple.com/sql-full-outer-join/
参考:http://datasciencemadesimple.com/sql-cross-join/
70gysomp9#
完全外部联接组合了左外部联接和右外部联接。结果集返回两个表中满足条件的行,但返回不匹配的空列。
交叉联接是不需要任何条件就能联接表的Cartesian product。结果集包含的行和列是两个表的乘积。