Clause中可能存在"大于0"的Oracle Bug

ber*_*ner 17 sql oracle select

我有一个select语句,它提供了错误的行数.我可以重现的问题Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionOracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production我不能复制的Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

测试数据:

CREATE TABLE PERSON AS
SELECT LEVEL AS ID, 'Person_'||LEVEL AS NAME, 10 as maxVal
FROM DUAL 
CONNECT BY LEVEL <= 5;

create table orders as
SELECT LEVEL AS ID, 'Order_'||LEVEL AS NAME
FROM DUAL 
CONNECT BY LEVEL <= 3;
Run Code Online (Sandbox Code Playgroud)

如果我尝试以下查询,我只得到3个结果而不是5个结果:

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > 0
Run Code Online (Sandbox Code Playgroud)

如果我将查询修改为以下,我得到5个结果(应该是正确的数字):

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > 1
Run Code Online (Sandbox Code Playgroud)

以下修改也会提供正确的结果:

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > 0 + 0
Run Code Online (Sandbox Code Playgroud)

如果我使用Bind Variables,我也会得到正确的结果数:

select p.*
      from person p
     where (maxVal - (select count(*)
                         from orders o
                        where o.id = p.id)
           )  > :num
Run Code Online (Sandbox Code Playgroud)

那么,如果我使用"大于0",是否有任何(已知)Bug?

小智 1

这是在修复另一个错误之后出现的错误。

(“错误 17564992 错误结果,错误 12999577 修复后出现 My Oracle Support 文档 ID 17564992.8”)

它有自己的补丁(补丁 17564992,我们尚未测试),但有一个解决方法(我们测试过):

alter session set "_fix_control" = '12999577:0';
alter session set "_optimizer_squ_bottomup"= FALSE;
Run Code Online (Sandbox Code Playgroud)