1

クエリを実行すると間違った結果が得られますが、間違った行は実行順序によって異なります。説明: 最初に次のようにクエリを実行すると:

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 )

私が得る結果は次のとおりです。

IDN_SUJETO_ATRIB_VIG    FEC_INI_VIGENCIA    IDN_SUJETO  FEC_FIN_VIGENCIA    VALOR   IDN_PARM_ATRIBUTO   SIOMAUD_USUARIO_ALTA    
1   2000-10-10 00:00:00 2   2050-10-10 00:00:00 COM2    55  (null)  (null)  (null)  (null)  (null)  (null)
2   2000-10-10 00:00:00 1   2050-10-10 00:00:00 COM1    55  (null)  (null)  (null)  (null)  (null)  (null)
541 2015-06-06 00:00:00 1245    2015-06-10 00:00:00 Suje    57  (null)  (null)  (null)  (null)  (null)  (null)
544 2015-05-28 00:00:00 1246    2015-06-03 00:00:00 Suj 57  (null)  (null)  (null)  (null)  (null)  (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 '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 )

フェッチされた結果は次のとおりです。

IDN_SUJETO_ATRIB_VIG    FEC_INI_VIGENCIA    IDN_SUJETO  FEC_FIN_VIGENCIA    VALOR   IDN_PARM_ATRIBUTO   SIOMAUD_USUARIO_ALTA    SIOMAUD_FECHA_ALTA  SIOMAUD_USUARIO_ULT_MODIF   SIOMAUD_FECHA_ULT_MODIF SIOMAUD_FECHA_BAJA  FECHA_BAJA_LOGICA
1   2000-10-10 00:00:00 2   2050-10-10 00:00:00 COM2    55  (null)  (null)  (null)  (null)  (null)  (null)
2   2000-10-10 00:00:00 1   2050-10-10 00:00:00 COM1    55  (null)  (null)  (null)  (null)  (null)  (null)
337 2011-06-01 00:00:00 1142    2011-06-30 00:00:00 CSA.1   57  (null)  (null)  (null)  (null)  (null)  (null)
541 2015-06-06 00:00:00 1245    2015-06-10 00:00:00 Suje    57  (null)  (null)  (null)  (null)  (null)  (null)

つまり、LAST の間違った状態だけを除外しています。誰かが理由を知っていますか?

4

2 に答える 2

2

ANDa AND b OR c AND dはOR よりも優先順位が高くなります。ここを参照してください。ブラケティングをチェック!(a AND b) OR (c AND d)A OR b OR c AND dA OR b OR (c AND d)

于 2012-11-28T13:05:20.543 に答える