子查询中的外连接没有 return 值
Outer join in subquery does not return value
假设我有这样一个 table:
主要table:
id | value
-----------
1 | 'not null'
已加入table:
id | value
-----------
2 | 'id does not match, whatever'
还有这样的 select 语句:
SELECT
m.value without_join,
(SELECT
m.value with_join
FROM
joined_table j
WHERE
j.id(+) = m.id) joined
FROM
main_table m;
return编译结果如下:
without_join | with_join
-------------------------
not null | (null)
执行内部联接而不是外部联接,即使我使用 (+)
运算符联接也是如此。由于子查询中没有行 select,空值不是 m.value
returned.
我预期的行为是在子查询中将 j
外连接到 m
,因此 return 不是来自 m
table.[= 的空值20=]
您正在从 Main table 中选择元素,然后从连接的 table 中选择元素,其中第二个 table 中的 id 与 main 中的项目的 id 相匹配table。由于第二个table中没有id为1的元素,所以另一个table中也没有匹配,所以结果为null。
我想你明白为什么会这样 return 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
值。
- 子查询 return 一行。
- 子查询正在从
m
中选择一个列,因此它应该在结果集中。
这行不通。当 j
和 m
在同一个 FROM
子句中时,这种外连接语法(显然)有效。
子查询正在实施外连接 无论如何。我的简单猜测是语法的设计者没有实现子查询的考虑功能,因为子查询已经是一个外部连接。在这一点上,关于 (+)
的文档至少有 20 年的历史,因此很难弄清楚这样的意图。
Oracle 在二十年前取代了 (+)
语法。我的建议就是不要使用它。它不是外部连接的推荐语法。子查询不需要它。
假设我有这样一个 table:
主要table:
id | value
-----------
1 | 'not null'
已加入table:
id | value
-----------
2 | 'id does not match, whatever'
还有这样的 select 语句:
SELECT
m.value without_join,
(SELECT
m.value with_join
FROM
joined_table j
WHERE
j.id(+) = m.id) joined
FROM
main_table m;
return编译结果如下:
without_join | with_join
-------------------------
not null | (null)
执行内部联接而不是外部联接,即使我使用 (+)
运算符联接也是如此。由于子查询中没有行 select,空值不是 m.value
returned.
我预期的行为是在子查询中将 j
外连接到 m
,因此 return 不是来自 m
table.[= 的空值20=]
您正在从 Main table 中选择元素,然后从连接的 table 中选择元素,其中第二个 table 中的 id 与 main 中的项目的 id 相匹配table。由于第二个table中没有id为1的元素,所以另一个table中也没有匹配,所以结果为null。
我想你明白为什么会这样 return 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
值。 - 子查询 return 一行。
- 子查询正在从
m
中选择一个列,因此它应该在结果集中。
这行不通。当 j
和 m
在同一个 FROM
子句中时,这种外连接语法(显然)有效。
子查询正在实施外连接 无论如何。我的简单猜测是语法的设计者没有实现子查询的考虑功能,因为子查询已经是一个外部连接。在这一点上,关于 (+)
的文档至少有 20 年的历史,因此很难弄清楚这样的意图。
Oracle 在二十年前取代了 (+)
语法。我的建议就是不要使用它。它不是外部连接的推荐语法。子查询不需要它。