我发现Oracle 11.2.0.2.0似乎是一个奇怪的错误。一切都告诉我这一定是一个错误,但是我一直找不到它,而且这是一个足够普遍的用例,您会认为它早已被发现并修复了。在Oracle的RDS版本(大约12岁)中,一切正常,这使我相信它一定是bug。
除了从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的行),因此列应为空。注意,我什至没有使用第二次联接的结果。但是,如果我不评论case
语句,结果就会改变!
id foo
-- ---
2 10
到目前为止,我已经观察到了一些东西:
case
语句),结果将更改。t2
的{{1}}语句中的文字有问题。也就是说,如果select
语句类似于select
,则select id, 10 as foo from "MY_TABLE"
将为空,但id
仍为10。有两种方法可以回答这个问题:
我不想要的答案是“这必须是一个错误,因为它违反了这样的规范”。我已经知道这一点,并且我已经完全同意你的看法。我需要知道为什么会发生这种情况(如果它不是错误),或者如果是错误,则在哪里/何时修复。
如果您的Oracle版本可以在两个版本的查询中正常工作,请在注释中注明版本号。找出这是什么错误以及何时对其进行修复可能会很有用。