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

时间:2018-11-05 11:38:11

标签: sql oracle subquery outer-join

假设我有一个这样的表:

主表:

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空值。

我期望的行为是在子查询中将j外部连接到m,因此从m表中返回非空值。

2 个答案:

答案 0 :(得分:2)

我认为您了解为什么会返回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在二十年前取代了(+)语法。我的建议是根本不使用它。对于外部联接,不建议使用此语法。子查询不需要它。

答案 1 :(得分:0)

您要从“主”表中选择元素,然后从联接的表中选择元素,其中第二个表中的ID与主表中的项目的ID相匹配。由于第二张表中没有ID为1的元素,因此另一张表中没有匹配项,因此结果为null。