为什么这个sql使用union all都没有返回数据

tan*_*ler 7 sql oracle union

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
Run Code Online (Sandbox Code Playgroud)

A   NULL    NULL
Run Code Online (Sandbox Code Playgroud)

sql第2的结果:

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
Run Code Online (Sandbox Code Playgroud)

B   NULL    NULL
Run Code Online (Sandbox Code Playgroud)

如果我联合所有这两部分的sql,我期望的sql是:

A    NULL    NULL
B    NULL    NULL
Run Code Online (Sandbox Code Playgroud)

但我没有结果.

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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ole 2

你还没有说你在哪个版本上遇到这个问题,但 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 补丁集中修复 - 我不确定我是否真的应该分享它,但它已经在这里发布- 因此修补可能是您最好的选择,Oracle 可能会建议您这样做提出 SR。如有疑问,请直接询问 Oracle。