假设我有一张这样的表:
主表:
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
表。
我假设你明白为什么这会返回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
,因此它应该在结果集中。这不起作用。当j
和m
在同一FROM
个子句中时,这种外连接语法(显然)有效。
无论如何,子查询正在实现外连接。我的简单猜测是语法的设计者没有实现子查询的考虑功能,因为子查询已经是一个外连接。在这一点上,文档(+)
至少有 20 年的历史,因此很难弄清楚这样的意图。
(+)
二十年前,Oracle 取代了该语法。我的建议是不要使用它。这不是外连接的推荐语法。并且子查询不需要它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句