加入的不同组合令人困惑,有人可以把它煮一点吗?

时间:2009-08-10 03:00:03

标签: sql sql-server sql-server-2005 tsql

本周末看看JOIN。

我正在阅读加入并看到大量的JOIN,LEFT,RIGHT,OUTER,FULL,INNER组合。我检查了MSDN文档,它看起来像是唯一允许的组合形式:

< join_type > ::=
    [ INNER | { { LEFT | RIGHT | FULL } [ OUTER] } ]
    [ < join_hint > ]
    JOIN

因此,我认为你只能得到:

JOIN / INNER JOIN
LEFT JOIN / LEFT OUTER JOIN
RIGHT JOIN / RIGHT OUTER JOIN
FULL JOIN / FULL OUTER JOIN

此外,OUTER似乎是一个可选关键字,因此LEFT JOIN和LEFT OUTER JOIN实际上是相同的。它是否正确? JOIN和FULL OUTER JOIN有什么区别?我在脚本中看到过单独的JOIN,但是无法将其分解,因为查询有点复杂。

4 个答案:

答案 0 :(得分:4)

只有三种连接:CROSS,INNER和OUTER。

  • 交叉连接从两个表中返回每个可能的行组合,并且不经常使用。
  • 内部联接仅返回两个表与连接条件匹配的行。
  • 外连接选择一个表作为“origin”表,并始终返回该表中的所有行。只要其他表中没有匹配项,就会提供NULL值。

在外连接(仅外连接)中,还有三种子类型:LEFT,RIGHT和FULL。

  • 对于左连接,第一个表是原始表。
  • 对于右连接,第二个表是原始表。
  • 对于完全连接,两个表都是原始表。

因为LEFT,RIGHT和FULL仅适用于OUTER连接,所以有时会省略OUTER关键字,而只是简单地指定哪种外连接(即,只是“LEFT JOIN”)。

答案 1 :(得分:1)

这些都是可以在表源之间进行的有效语法:

JOIN
INNER JOIN
LEFT JOIN
LEFT OUTER JOIN
RIGHT JOIN
RIGHT OUTER JOIN
FULL JOIN
FULL OUTER JOIN

每个都需要以下ON子句。

你是正确的OUTER是可选的,因此RIGHT JOIN与RIGHT OUTER JOIN相同,同样适用于LEFT和FULL。此外,如果没有,则INNER是可选的,因此JOIN与INNER JOIN相同。

还有CROSS JOIN,它与逗号相同,没有ON子句。换句话说,

FROM A CROSS JOIN B

FROM A,B

意思完全相同。

表运算符JOIN和FULL OUTER JOIN完全不相同。表源

FROM A JOIN B ON <condition>

仅包含其行为true的行。另一方面,表源

FROM A FULL OUTER JOIN B ON <condition>

包含的行为以及您在LEFT OUTER JOIN或具有相同ON子句的RIGHT OUTER JOIN中获得的所有其他行。

答案 2 :(得分:1)

您似乎拥有的组合多于支持的组合:

<join_type> ::=
    [ INNER | { { LEFT | RIGHT | FULL } [ OUTER] } ]
    [ <join_hint> ]
    JOIN

这说你可以:

       JOIN                    INNER JOIN
 LEFT  JOIN              LEFT  OUTER JOIN
 RIGHT JOIN              RIGHT OUTER JOIN
 FULL  JOIN              FULL  OUTER JOIN

换句话说,关键字OUTER是可选的。在完整的SQL标准中,您还可以拥有NATURAL JOIN或CROSS JOIN。关键字INNER也是可选的;简单的“加入”是一个内部联接。

实际上,你答案的格式化让我觉得你不理解;它使用LEFT JOIN运行INNER JOIN(如果没有其他人的话,我会很快解决这个问题。)

FULL JOIN与普通(INNER)JOIN完全不同。 INNER JOIN简单地基于指定的标准(由ON子句或USING子句指定)。 LEFT OUTER JOIN包含INNER JOIN的行以及左侧表中未与右侧表连接的那些行,右侧表中的每一列都使用NULL扩展。这有时被称为“左外增量”。 RIGHT OUTER JOIN反转了外连接的意义(所以有一个'右外增量')。 FULL JOIN由INNER JOIN和左外增量和右外增量的并集组成。 FULL JOIN的结果没有主键,因为每列中通常都有空值。

答案 3 :(得分:0)

Wikipedia article on SQL join很清楚,有很多例子。