假设我有一个这样的表格:
主表:
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 回答
我假设你明白为什么会返回
NULL
:内部联接没有匹配 .
我能理解你的逻辑 . 它像:
子查询正在进行外连接(尽管没有明确的
join
语法) .它应该保留
m
的所有值,填充j
将NULL
值用于非匹配 .子查询返回一行 .
子查询正在从
m
中选择一列,因此它应该在结果集中 .这不起作用 . 当
j
和m
在同一FROM
子句中时,此外连接语法(显然)有效 .子查询无论如何都在实现外连接 . 我的简单猜测是语法的设计者没有实现子查询的功能,因为子查询已经是外连接 . 此时,
(+)
的文档至少已有20年的历史,因此很难弄清楚这些意图 .二十年前,Oracle取代了
(+)
语法 . 我的建议是不要使用它 . 它不是外连接的推荐语法 . 子查询不需要它 .您正在从主表中选择元素,然后从连接表中选择元素,其中第二个表中的id与主表中的项的ID匹配 . 由于第二个表中没有id为1的元素,因此另一个表中没有匹配项,因此结果为null .