首页 > 解决方案 > 具有多个外部连接和 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

由于第一个外部连接失败(没有t2id 为 1 的行),因此列应为 null。请注意,我什至没有使用第二次连接的结果。但是,如果我取消注释该case语句,结果就会改变!

id    foo
--    ---
2     10

以下是我到目前为止观察到的一些事情:

有几种方法可以回答这个问题:

想要的是“这一定是一个错误,因为它违反了某某规范”的答案。我已经知道这一点,我已经完全同意你的看法。我需要知道它为什么会发生(如果它不是一个错误),或者如果它是一个错误,它是在哪里/何时修复的。

如果您有一个 Oracle 版本,其中两个版本的查询都能正常工作,请在评论中留下版本号。找出这是什么错误以及修复时间可能很有用。

标签: sqloracleoracle11g

解决方案


推荐阅读