【发布时间】:2019-07-23 10:31:34
【问题描述】:
我从来没有想过“新”SQL 连接语法,因此使用带有 (+) 的“旧”连接系统。我知道是时候学习它了 - 但是我发现旧语法更加直观,尤其是在处理具有多个连接的多个表时。
但是我现在有一个操作需要在同一个表上进行两个外连接。我的代码是:
SELECT
C.ID,
R.VALUE,
R.LOG_ID,
LOG.ACTION
FROM
C,
R,
LOG
WHERE
C.DELETED IS NULL
AND R.DELETED IS NULL
-- Two joins below
AND R.C_ID(+) = C.ID
AND R.LOG_ID(+) = LOG.ID
但是这会导致错误:
ORA-01417 - 一个表最多可以外部连接到一个表。
搜索这个错误我发现解决方案是使用新语法例如这个答案在SO上: Outer join between three tables causing Oracle ORA-01417 error
所以我知道有些人可能会认为这个问题是重复的,因为它在技术上已经有了答案。但是,该问题中提出的“旧”语法不包含与我在这里完全相同数量的表和连接,并且尽我所能尝试,我不确定如何将其纳入我自己的代码中。
有人可以帮忙吗?谢谢。
【问题讨论】:
-
也许你应该习惯使用超过 25 年的“新”语法,因为它已经在 1992 年的 SQL 标准中。
-
LOG和C之间没有连接条件;是这样吗?
-
甚至 Oracle 都建议对外部连接使用“新”语法,并停止使用专有的
(+)运算符。 -
事实上,旧语法可能是模棱两可的(因为它定义了列上的连接)。新语法不是(因为它定义了表上的连接)
-
我听到你在进行切换 - 我曾经认为旧方式更容易“计算”,而新方式几乎无法理解,但实际上,一旦我做出切换,它实际上非常简单而合乎逻辑(即使它确实让我对我如何看待连接有不同的心理画面)。我完全建议切换到新语法 - 一开始它更清晰(所有连接条件都与它们正在连接的表一起),并且不太容易出现无意的交叉连接(当你添加连接条件时很容易忘记将它们添加为谓词)。而且新样式更加灵活!