[Seasar-user:10528] [DBFlute]Paging のSQLについて(Oracle)

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 9月 14日 (金) 15:00:46 JST


いつもお世話になっております。
米原です。

以下を使用しております。
DBFlute-0.5.4
s2-dao-1.0.44
Oracle10g

DBFluteのPaging機能にて
1ページ目と2ページ目以降にて発行されるSQLが
異なっています。

■1ページ目
SELECT * FROM
    (SELECT A_TBL.A_CD, A_TBL.A_FLG FROM A_TBL	
    ORDER BY A_TBL.A_FLG asc)	
WHERE rownum <= 10	

■2ページ目以降
SELECT * FROM
    (SELECT base.*, rownum as rn FROM
        (SELECT A_TBL.A_CD, A_TBL.A_FLG FROM A_TBL		
        ORDER BY A_TBL.A_FLG asc) base)	
WHERE rn > 10 AND rn <= 20	


1ページ目のみ異なるのは、Oracleのrownumにて1件目〜N件目の
指定の際は、rownumでいったん採番しなくとも取得
できるため速い、というものだと思います。

しかしながら、このSQLの違いから、ORDER BYのカラムが
ユニークで無い場合に、1ページ目と2ページ目で取得データ
が重複してしまうという現象が発生しています。

確かに、1ページ目のSQLを2ページ目と同様に記述
してみると、若干取得順序が変わる場合があることを
確認致しました。

■1ページ目(修正版)
SELECT * FROM
    (SELECT base.*, rownum as rn FROM
        (SELECT A_TBL.A_CD, A_TBL.A_FLG FROM A_TBL		
        ORDER BY A_TBL.A_FLG asc) base)	
WHERE rn > 0 and rn <= 10		


ORDER BYでユニークなカラムを指定していない以上、
元の方法で必ず重複する条件、及び修正版で必ず重複しないか、
といった証明は難しいですが、より取得順序の精度が高いのは
修正版の方だと思われます。(少なくとも、現在報告を受けています
重複は回避できるそうですし)

こちらの修正の取込をご検討頂けないでしょうか?
よろしくお願い致します。

長文で申し訳ございません。





Seasar-user メーリングリストの案内