[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 メーリングリストの案内