sql - 具有多个外部连接和 case 语句的 Oracle 错误?
问题描述
我发现 Oracle 11.2.0.2.0 出现了一个奇怪的错误。一切都告诉我这一定是一个错误,但我无法找到它的提及,这是一个足够常见的用例,你会认为它早就被发现并修复了。在 RDS 版本的 Oracle(12 岁左右)中一切正常,这让我相信它一定是一个错误。
我已经能够重现这个问题,只需要选择 from dual
,所以不需要添加表来测试它。考虑以下 SQL:
select t2.*
from (
select 1 as id from "DUAL"
) t1
left outer join (
select 2 as id, 10 as foo from "DUAL"
) t2 on t1.id = t2.id
left outer join (
select
1 as id,
-- case when 1 = 1 then 10 else 7 end as foo,
2 as bar
from "DUAL"
) t3 on t1.id = t3.id
它会产生您期望的结果:
id foo
-- ---
null null
由于第一个外部连接失败(没有t2
id 为 1 的行),因此列应为 null。请注意,我什至没有使用第二次连接的结果。但是,如果我取消注释该case
语句,结果就会改变!
id foo
-- ---
2 10
以下是我到目前为止观察到的一些事情:
- 如果查询中有 1 个或多个额外的外部联接也包含一条
case
语句,则结果会发生变化。 - 第二个外部连接通过或失败都没有关系。
- 似乎只有
t2
'select
语句中的文字存在问题。也就是说,如果select
语句类似于select id, 10 as foo from "MY_TABLE"
,id
会如您所期望的那样为空,但foo
仍然是 10。
有几种方法可以回答这个问题:
- 如果这实际上不是错误,您能否解释为什么会发生这种情况并引用解释该行为的文档?
- 如果这是一个错误,您能否链接到对该错误的引用以及它在哪个版本的 11g 中得到解决(如果有的话)?
我不想要的是“这一定是一个错误,因为它违反了某某规范”的答案。我已经知道这一点,我已经完全同意你的看法。我需要知道它为什么会发生(如果它不是一个错误),或者如果它是一个错误,它是在哪里/何时修复的。
如果您有一个 Oracle 版本,其中两个版本的查询都能正常工作,请在评论中留下版本号。找出这是什么错误以及修复时间可能很有用。
解决方案
推荐阅读
- javascript - JSON 对象无法转换为 JSON 对象
- java - 使用 EditText.setText(value) 时停止刷新我的键盘
- javascript - 输入价格后如何在表格中添加另一行并计算金额(数量*价格)?
- php - 我已经集成了条带连接支付流程。我向管理员帐户收费,它工作正常,但连接帐户返回余额不足错误
- python-3.x - pymagnitude 库中函数 Magnitude.most_similar() 使用的算法是什么?
- powershell - New-PSSession:连接远程服务器outlook.office365.com失败:参数不正确
- image - 未在 CachedNetworkImage 中指定图像 url 时应用程序崩溃
- c - Valgrind 显示肯定丢失了字节,但应该是免费的?
- javascript - ReferenceError: $ 未定义 (WebdriverIO)
- javascript - 将缩放和旋转值重置为零 Onclick 按钮