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

kubo [E-MAIL ADDRESS DELETED]
2007年 9月 14日 (金) 16:36:08 JST


久保です。

> > ■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でユニークなカラムを指定していない以上、
> > 元の方法で必ず重複する条件、及び修正版で必ず重複しないか、
> > といった証明は難しいですが、より取得順序の精度が高いのは
> > 修正版の方だと思われます。(少なくとも、現在報告を受けています
> > 重複は回避できるそうですし)
> > 
> > こちらの修正の取込をご検討頂けないでしょうか?
> 
> うおお、ありがとうございます!(大感謝)
> 
> OracleのRownumは本当にクセが強いため、
> もう一度自分でも検証してみます。

米原さん、すいません。

こちらの修正ですが、

allcommon.cbean.sqlclause.SqlClauseOracleの

doFetchFirst()を以下のようにすることで要件満たせますでしょうか?

    protected void doFetchFirst() {
        doFetchPage();
    }

要は、1ページ目の検索でも2ページ目以降と同じ扱いでSQLを組み立てます。
実は、他のDB(MySQLとかPostgreSQL)では、このように実装しているのですが、
Oracleだけは、副問い合わせを一つ減らすことを中途半端にやってしまいました。
(getPageStartIndex()は、doFetchFirst()時は0になります)







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