具有多个外部联接和一个case语句的Oracle bug?

时间:2018-08-07 17:50:44

标签: sql oracle oracle11g

我发现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

到目前为止,我已经观察到了一些东西:

  • 如果查询中有1个或多个其他外部联接(其中也包含case语句),结果将更改。
  • 第二个外部联接通过还是失败都没有关系。
  • 仅出现t2的{​​{1}}语句中的文字有问题。也就是说,如果select语句类似于select,则select id, 10 as foo from "MY_TABLE"将为空,但id仍为10。

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

  • 如果这实际上不是错误,您可以解释为什么会发生这种情况,并引用说明行为的文档吗?
  • 如果这是一个错误,您可以链接到该错误的引用以及该错误在哪个版本的11g中解决(如果有)?

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

如果您的Oracle版本可以在两个版本的查询中正常工作,请在注释中注明版本号。找出这是什么错误以及何时对其进行修复可能会很有用。

0 个答案:

没有答案