内连接和没有任何连接条件的表中有两个ON条件是啥意思

Posted

技术标签:

【中文标题】内连接和没有任何连接条件的表中有两个ON条件是啥意思【英文标题】:What does it mean when there are two ON conditions in an inner join and a table without any join condition内连接和没有任何连接条件的表中有两个ON条件是什么意思 【发布时间】:2021-07-12 10:48:35 【问题描述】:

我遇到了一个奇怪的连接条件,需要帮助。

我有一个这样的 SQL 代码,想知道会发生什么:

SELECT A.a,
       B.b
FROM   A
       INNER JOIN B
               ON A.a = B.b
       RIGHT OUTER JOIN C
                        INNER JOIN D
                                ON C.c = D.d
                        INNER JOIN E
                                ON D.d = E.e
                     ON C.c2 = A.a2 

这可行,但我不知道在上述情况下会发生什么。 C表是右连接还是内连接?在内部连接之后放置 on 条件的目的是什么。这有什么区别吗?

关于这个的join执行顺序是什么?

版本:SQL Server 2016

【问题讨论】:

这能回答你的问题吗? Weird join on on behavior in tsql What does the position of the ON clause actually mean? 【参考方案1】:

这样写JOIN条件是很不正统的。虽然这是允许的,但是将两个 ON 条件放在一起并且没有在 JOIN 之后紧跟一个 ON 只是令人困惑。

不过,对于人们来说比 SQL 解析器更是如此。解析复杂连接时,可以想象有括号:

SELECT A.a, B.b
FROM (A INNER JOIN
      B
      ON A.a = B.b
     ) RIGHT OUTER JOIN
     (C INNER JOIN
      D
      ON C.c = D.d INNER JOIN
      E
      ON D.d = E.e
     )
     ON C.c2 = A.a2;

这些括号是多余的。他们正在展示如何解析 SQL。

现在您的问题是关于RIGHT JOIN 条件和表CRIGHT JOINCDE 上的 INNER JOIN 的结果。

因此,这些都不是真实的陈述(通常):

这是C 上的“内部联接”。 这是C 上的“右外连接”。

因为外连接是对三个表进行内连接的结果。

如果可以,我建议重写条件以使其更清晰!至少,插入括号(虽然是多余的)使代码更易于人类理解。

【讨论】:

当您需要LEFT JOIN INNER JOIN 的结果时这样做很正常,在某些情况下,如果不使用派生表就没有其他方法。我认为RIGHT JOIN 更不正统,有RIGHT 不可能是LEFT,所以没有人真正使用它。而且你没有说得足够清楚,也许应该说的一点是解析器只查看ON 子句的顺序,而不是它是什么类型的连接

以上是关于内连接和没有任何连接条件的表中有两个ON条件是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

26.MySQL中的内连接INNER JOIN

如何使用 SQL 和 Python 连接两个具有日期条件的表?

MySQL - 数据查询语言DQL数据连接语法及实例

MySQL连接查询(多表查询)

多表查询

mysql - on 条件 vs where 条件