sql - 子查询中的外连接不返回值
问题描述
假设我有一张这样的桌子:
主表:
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 取代了该语法。我的建议就是不要使用它。这不是外连接的推荐语法。子查询不需要它。
推荐阅读
- firebase - Flutter 使用 FutureBuilder 检索列表中的数据
- python - RobotFramework 从大量数字中获取每个单独的数字
- python - Tkinter Listbox:操纵行的显示(或显示一列但来自同一数据帧的另一列)
- javascript - Node.js 服务器请求对象在函数中定义时似乎没有被隔离
- c# - 截至今天,omnisharp 无法正常启动(无法从程序集中加载“CheckForDuplicateFrameworkReferences”任务 [...])
- javascript - 如何从 php 文件中的 javascript 文件调用函数
- list - 使用索引列表实现 map 函数
- mongodb - 事务将与 mongodb 聚合 $merge 一起使用吗?
- c++ - 使用函数、模板元编程或任何其他解决方案返回类型名
- opentext - Livelink - OpenText:调用 rmclassifications 以通过 API 更新状态