ケントのブログ(ふわふわ)

技術メモ、アイドル、演劇、美術など分からないなりに

Oracleでページング。ORDER BYが邪魔してくる。

OracleSQLでページング機能を入れようと改修。

WHERE ROWNUM BETWEEN 11 AND 20という風に単純には出来ないよう。

ORACLE/オラクルSQLリファレンス(ROWNUM)

こちらを参考に元のSQLをラッピングする形にした。

select *

from

  (select 

     rownum as row_id, TABLAの項目名羅列

   from TABLE名

   where 条件

   order by ソート順序)

where 

  row_id between 11 and 20

結果を見てみると、元のSQLの結果と違う部分が10件抽出されている。

ROWNUMを見てみると、ソートの前にナンバリングされていて、それに対してBETWEENされているらしい。

ROWNUMよりROW_NUMBER() - A Day In The Life

こちらを参考に、ROW_NUMBER()を使用してORDER BY後にナンバリングするように変更しました。

select *

from

  (select 

row_number() over(

order by ソート順序

) as row_id, TABLAの項目名羅列

   from TABLE名

   where 条件

   order by ソート順序)

where 

  row_id between 11 and 20

(order byが二つあるのはいいのかしら・・・)

これでSQLを変更する前の11番目から20番目のデータを抽出できるようになりました。

ありがとうございます。