【问题标题】:why this sql used union all returned no data为什么这个 sql 使用 union 都没有返回数据
【发布时间】:2014-05-31 12:34:38
【问题描述】:

sql 1st 的结果:

select p1.t1, p2.t2, p2.t3 from 
(select 'A' as t1,'' as t2,'' as t3 from dual ) p1 left join
(select '' as t1, '' as t2, '' as t3 from dual where 1=2) p2 on p1.t1 = p2.t1

A   NULL    NULL

sql 2nd 的结果:

select p1.t1, p2.t2, p2.t3 from 
(select 'B' as t1,'' as t2,'' as t3 from dual ) p1 left join
(select '' as t1, '' as t2, '' as t3 from dual where 1=2) p2 on p1.t1 = p2.t1

B   NULL    NULL

如果我合并这两个部分的 sql,我预期的 sql 是:

A    NULL    NULL
B    NULL    NULL

但我没有得到任何结果。

sql如下:

select p1.t1, p2.t2, p2.t3 from 
(select 'A' as t1,'' as t2,'' as t3 from dual ) p1 left join
(select '' as t1, '' as t2, '' as t3 from dual where 1=2) p2 on p1.t1 = p2.t1
union all
select p1.t1, p2.t2, p2.t3 from 
(select 'B' as t1,'' as t2,'' as t3 from dual ) p1 left join
(select '' as t1, '' as t2, '' as t3 from dual where 1=2) p2 on p1.t1 = p2.t1

我在 oracle 上测试了这个 sql。 我想知道为什么结果不像我的预期。 顺便说一句,如果使用 union 而不是 union all,结果就像预期的一样。

【问题讨论】:

  • 这是非常奇怪的行为,至少在 SQL Fiddle 上得到了证实,sqlfiddle.com/#!4/d41d8/27926
  • 我认为没有理由发生这种情况。它适用于我的 dbms (Ora 10g)。你用的是什么版本?
  • 我在 Oracle 11g 版本 11.2.0.3.0 中得到了正确的结果
  • 我在公司的oracle上测试过这个sql,执行后没有结果。我没有关注版本。我明天看看版本。
  • 如果您使用的是 11.2.0.2(就像 SQL Fiddle 一样),可能是错误 12336962?

标签: sql oracle union


【解决方案1】:

您还没有说您在哪个版本上遇到此问题,但 Gordon Linoff 在运行 11.2.0.2 的 SQL Fiddle 上进行了复制,正如其他人所说,它在 10g 和 11.2.0.3 中没有出现,所以这似乎是合理的认为您可能也在 11.2.0.2 上。

在这种情况下,这看起来与错误 12336962 相同。如果您有权访问 Oracle 支持,则您(或您的 DBA)可以查看它,但我无法在此处复制它所说的内容,即使它是一个已发布的错误。运行您的查询和错误报告中的示例会产生相同的结果,并且在这两种情况下,从 union all 更改为 union 都会产生正确的结果。不过,您可能需要提出服务请求以得到确认。

该错误已在 11.2.0.3 补丁集中修复 - 我不确定我是否真的应该分享它,but it's already published here - 所以修补可能是你最好的选择,Oracle 可能会建议,如果你一定要提出 SR。如有疑问,请直接询问 Oracle。

【讨论】:

  • 版本是11g(11.2.0.1.0),我同意你的意见。
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多