クエリを実行すると間違った結果が得られますが、間違った行は実行順序によって異なります。説明: 最初に次のようにクエリを実行すると:
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 の間違った状態だけを除外しています。誰かが理由を知っていますか?