假设我有一个这样的表:
主表:
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
表中返回非空值。
答案 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
中选择一列,因此它应该在结果集中。这不起作用。当j
和m
在同一FROM
子句中时,这种外部联接语法(显然)有效。
子查询仍在实现外部联接 。我的简单猜测是,语法设计人员并未实现考虑子查询的功能,因为子查询已经是外部联接。目前,(+)
上的文档至少有20年的历史,因此很难弄清这种意图。
Oracle在二十年前取代了(+)
语法。我的建议是根本不使用它。对于外部联接,不建议使用此语法。子查询不需要它。
答案 1 :(得分:0)
您要从“主”表中选择元素,然后从联接的表中选择元素,其中第二个表中的ID与主表中的项目的ID相匹配。由于第二张表中没有ID为1的元素,因此另一张表中没有匹配项,因此结果为null。