子查询中的外连接没有 return 值

Outer join in subquery does not return value

假设我有这样一个 table:

主要table:

id | value
-----------
1  | 'not null'

已加入table:

id | value
-----------
2  | 'id does not match, whatever'

还有这样的 select 语句:

SELECT
  m.value without_join,
  (SELECT
     m.value with_join
   FROM
     joined_table j
   WHERE
     j.id(+) = m.id) joined
FROM
  main_table m;

return编译结果如下:

without_join | with_join
-------------------------
not null     | (null)

执行内部联接而不是外部联接,即使我使用 (+) 运算符联接也是如此。由于子查询中没有行 select,空值不是 m.value returned.

我预期的行为是在子查询中将 j 外连接到 m,因此 return 不是来自 m table.[= 的空值20=]

您正在从 Main table 中选择元素,然后从连接的 table 中选择元素,其中第二个 table 中的 id 与 main 中的项目的 id 相匹配table。由于第二个table中没有id为1的元素,所以另一个table中也没有匹配,所以结果为null。

我想你明白为什么会这样 return NULL:

SELECT m.value as without_join,
       (SELECT m.value with_join
        FROM joined_table j
        WHERE j.id = m.id
       ) as joined
FROM main_table m;

内部联接没有匹配项。

我能理解你的逻辑。它是这样的:

  • 子查询正在进行外连接(尽管没有显式 join 语法)。
  • 它应该保留 m 的所有值,填写 j 将为不匹配的 NULL 值。
  • 子查询 return 一行。
  • 子查询正在从 m 中选择一个列,因此它应该在结果集中。

这行不通。当 jm 在同一个 FROM 子句中时,这种外连接语法(显然)有效。

子查询正在实施外连接 无论如何。我的简单猜测是语法的设计者没有实现子查询的考虑功能,因为子查询已经是一个外部连接。在这一点上,关于 (+) 的文档至少有 20 年的历史,因此很难弄清楚这样的意图。

Oracle 在二十年前取代了 (+) 语法。我的建议就是不要使用它。它不是外部连接的推荐语法。子查询不需要它。