Oracle SQL-执行顺序或条件

Oracle SQL-执行顺序或条件,sql,oracle,Sql,Oracle,我在执行查询时得到错误的结果,但得到的错误行取决于执行顺序。说明:如果我首先执行以下查询: select * from PROG_TSUJETO_ATRIB_VIG sujetoatri0_ where ((sujetoatri0_.valor like 'COM2' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.

我在执行查询时得到错误的结果,但得到的错误行取决于执行顺序。说明:如果我首先执行以下查询:

select * 
from PROG_TSUJETO_ATRIB_VIG sujetoatri0_ 
where ((sujetoatri0_.valor like 'COM2' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'COM1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suje' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suj' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('28/05/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('03/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'CSA.1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('19/08/2013 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('20/08/2010 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    and(sujetoatri0_.IDN_PARM_ATRIBUTO=55 )and(sujetoatri0_.FECHA_BAJA_LOGICA is NULL )
select *
from PROG_TSUJETO_ATRIB_VIG sujetoatri0_ 
where ((sujetoatri0_.valor like 'COM2' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'COM1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'CSA.1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('19/08/2013 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('20/08/2010 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suje' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suj' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('28/05/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('03/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    and(sujetoatri0_.IDN_PARM_ATRIBUTO=55 )and(sujetoatri0_.FECHA_BAJA_LOGICA is NULL )
我不应该得到第3行和第4行,因为我要的是55行,那些有57行。但更重要的是,如果我改变OR条件(第3和第5)的顺序,如下所示:

select * 
from PROG_TSUJETO_ATRIB_VIG sujetoatri0_ 
where ((sujetoatri0_.valor like 'COM2' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'COM1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suje' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suj' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('28/05/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('03/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'CSA.1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('19/08/2013 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('20/08/2010 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    and(sujetoatri0_.IDN_PARM_ATRIBUTO=55 )and(sujetoatri0_.FECHA_BAJA_LOGICA is NULL )
select *
from PROG_TSUJETO_ATRIB_VIG sujetoatri0_ 
where ((sujetoatri0_.valor like 'COM2' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'COM1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('01/01/2001 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('01/01/2049 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'CSA.1' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('19/08/2013 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('20/08/2010 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suje' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('06/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    or((sujetoatri0_.valor like 'Suj' )and(sujetoatri0_.FEC_INI_VIGENCIA<=to_date('28/05/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS'))and(sujetoatri0_.FEC_FIN_VIGENCIA>=to_date('03/06/2015 00:00:00' , 'dd/MM/yyyy HH24:MI:SS')))
    and(sujetoatri0_.IDN_PARM_ATRIBUTO=55 )and(sujetoatri0_.FECHA_BAJA_LOGICA is NULL )
也就是说,它只排除了最后一个错误的条件。
有人知道为什么吗?

并且比或更高的频率-
a和b或c和d
实际上是
(a和b)或(c和d)
类似地,
a或b或c和d
实际上是
a或b或(c和d)
。看见检查你的支架

从您的第一个查询中,我已经复制了,但是为了可读性重新格式化了。你的问题是,你的所有“或”条件都与你的最终“和”条件处于同一水平,从而使它们符合条件

select 
      * 
   from 
      PROG_TSUJETO_ATRIB_VIG sujetoatri0_ 
   where 
         (     ( sujetoatri0_.valor like 'COM2' )
           and ( sujetoatri0_.FEC_INI_VIGENCIA <= to_date('01/01/2001 00:00:00', 'dd/MM/yyyy HH24:MI:SS' ))
           and ( sujetoatri0_.FEC_FIN_VIGENCIA >= to_date('01/01/2049 00:00:00', 'dd/MM/yyyy HH24:MI:SS' ))
         )
      or (     ( sujetoatri0_.valor like 'COM1' )
           and ( sujetoatri0_.FEC_INI_VIGENCIA <= to_date('01/01/2001 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
           and ( sujetoatri0_.FEC_FIN_VIGENCIA >= to_date('01/01/2049 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
         )
      or (     (  sujetoatri0_.valor like 'Suje' )
           and ( sujetoatri0_.FEC_INI_VIGENCIA <= to_date('06/06/2015 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
           and ( sujetoatri0_.FEC_FIN_VIGENCIA >= to_date('06/06/2015 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
         )
      or (     ( sujetoatri0_.valor like 'Suj' )
           and ( sujetoatri0_.FEC_INI_VIGENCIA <= to_date('28/05/2015 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
           and ( sujetoatri0_.FEC_FIN_VIGENCIA >= to_date('03/06/2015 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
         )
      or (     ( sujetoatri0_.valor like 'CSA.1' )
           and ( sujetoatri0_.FEC_INI_VIGENCIA <= to_date('19/08/2013 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
           and ( sujetoatri0_.FEC_FIN_VIGENCIA >= to_date('20/08/2010 00:00:00', 'dd/MM/yyyy HH24:MI:SS'))
         )
     and ( sujetoatri0_.IDN_PARM_ATRIBUTO=55 )
     and ( sujetoatri0_.FECHA_BAJA_LOGICA is NULL )
因此,通过将所有OR条件包装为一个,它将语句更改为

select where ( any of these or conditions )
         AND ( 55 condition )
         AND ( null condition )
根据您的回复,答案将更详细,您的查询被解释为什么将被处理为什么

   ( com2 test )
OR ( com1 test )
OR ( suje test )
OR ( suj test )
OR (( CSA.1 test ) AND ( 55 test ) AND ( null test ))

就是这样,它的优先级比OR高。我不知道,非常感谢。是的,这正是我想要的,但问题是我似乎无法插入我在JPA实现中需要的括号,但这是另一个问题。我只是想知道它为什么会这样。谢谢。@LuisSep,请参阅修改后的答案
   ( com2 test )
OR ( com1 test )
OR ( suje test )
OR ( suj test )
OR (( CSA.1 test ) AND ( 55 test ) AND ( null test ))