子查询中的外部联接不返回值

保劳斯卡斯96

假设我有一张这样的表:

主表:

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

连接表:

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

和这样的选择语句:

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

返回结果如下:

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

即使我使用(+)运算符加入,也执行内部连接而不是外部连接由于在子查询中没有选择行,而不是m.value返回空值。

我所期望的行为是外部联接jm子查询,因此从没有返回空值m表。

戈登·利诺夫

我假设你明白为什么这会返回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值。
  • 子查询返回一行。
  • 子查询从 中选择一列m,因此它应该在结果集中。

这不起作用。jm在同一FROM个子句中这种外连接语法(显然)有效

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章