首页 文章

子查询中的外连接不返回值

提问于
浏览
-1

假设我有一个这样的表格:

主表:

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 null值 .

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

2 回答

  • 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 的所有值,填充 jNULL 值用于非匹配 .

    • 子查询返回一行 .

    • 子查询正在从 m 中选择一列,因此它应该在结果集中 .

    这不起作用 . 当 jm 在同一 FROM 子句中时,此外连接语法(显然)有效 .

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

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

  • 0

    您正在从主表中选择元素,然后从连接表中选择元素,其中第二个表中的id与主表中的项的ID匹配 . 由于第二个表中没有id为1的元素,因此另一个表中没有匹配项,因此结果为null .

相关问题