【发布时间】:2019-04-08 18:27:39
【问题描述】:
假设我有一张这样的桌子:
主表:
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 表中返回非空值。
【问题讨论】:
-
好的,你知道为什么
SELECT * FROM main_table m返回一行而SELECT * FROM main_table m JOIN joined_table j ON m.id = j.id不返回任何行吗? -
拉迪姆,我愿意。但是,以下语句:
SELECT * FROM main_table m LEFT OUTER JOIN joined_table j ON m.id = j.id返回一些行。我不明白为什么在子选择中执行内连接而不是外连接。 -
这似乎是一个有效的(虽然非常过时)的问题。我不明白反对票。
-
为什么有什么不同,为什么它们应该相同? PS minimal reproducible example PS 甚至 Oracle 都说,不要使用
(+),使用left join。尽管您没有将(+)与,一起使用,但它没有任何效果。阅读有关左连接的手册。 PS请通过帖子编辑澄清,而不是cmets。
标签: sql oracle subquery outer-join