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 ))