内连接和没有任何连接条件的表中有两个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
条件和表C
。 RIGHT JOIN
是 C
、D
和 E
上的 INNER JOIN
的结果。
因此,这些都不是真实的陈述(通常):
这是C
上的“内部联接”。
这是C
上的“右外连接”。
因为外连接是对三个表进行内连接的结果。
如果可以,我建议重写条件以使其更清晰!至少,插入括号(虽然是多余的)使代码更易于人类理解。
【讨论】:
当您需要LEFT JOIN
INNER JOIN
的结果时这样做很正常,在某些情况下,如果不使用派生表就没有其他方法。我认为RIGHT JOIN
更不正统,有RIGHT
不可能是LEFT
,所以没有人真正使用它。而且你没有说得足够清楚,也许应该说的一点是解析器只查看ON
子句的顺序,而不是它是什么类型的连接以上是关于内连接和没有任何连接条件的表中有两个ON条件是啥意思的主要内容,如果未能解决你的问题,请参考以下文章