我正在尝试了解旧的 Oracle Left Join 语法。
有两个表就可以了:
FROM A, B
WHERE
A.Col = B.Col (+)
(我们将此查询称为 Q0)
这很容易理解,例如和这个维恩diagram
但是,当我们添加第三个或更多表时,我的大脑就想关闭:
FROM A,B,C
WHERE
A.C = B.C (+) AND
C.C = A.C (+)
(我们称之为 Q1)
它应该等于:(我刚刚更改了左侧连接条件的位置)
FROM A,B,C
WHERE
C.C = A.C (+) AND
A.C = B.C (+)
(我们称之为 Q2)
这是我对这些问题的看法,我的问题是我是否理解正确:
据我了解,解释两个以上表的左连接的一种方法是将其视为左连接链,其中一个是另一个的输入,它是否正确?
因此,在 Q1 中,我们有两个左连接,第一个是 A 与 B 的左连接,其中 A 是左表。第二个左连接对我来说开始变得棘手。起初我以为是表 C 与表 A 左连接,其中 C 是左表。但这似乎是不正确的,而应该将其视为 C 左连接与第一个左连接的结果,其中 C 是左表。它是否正确?
但是我如何在第二季度应用这个“链原理”呢?
我尝试复制 Q1 中的推理:第一个连接是 C 与 A 左连接,其中 C 是左表。第二个联接是 A 与第一个联接的结果之间的左联接,其中 A 是左表。但这没有意义,第二个左连接的连接条件是在A列和B列之间,而第一个左连接的结果中没有B列。
出于好奇+,我尝试在第二个连接中切换左表和右表,即第一个连接的结果将充当第二个左连接中的左表,与 B 左连接。看起来这有效,结果变得与 Q1 相同。但我不知道如何解释为什么会这样。
因此,如果有人能建议一种在使用 oracle 语法时通用适用于三个或更多表的推理方法,我们将不胜感激。
如果这样的通用方法包含将 oracle 语法转换为 ANSI 语法的通用方法,也可以,因为我可以更容易地理解这一点。