Oracleでページング処理


Web系のシステムで利用されるDBは、PostgresqlやMySQLがあります。MySQLは有償化しましたがそのフォークであるMariaDBが無償で使えるのでいつも便利に使っています。
何が便利なのかというとWebの世界で育ってきたということもあるのでとても便利に使えます。

ページング(ページネーション)

いくつか便利な点がありますがそのうちの一つが「ページング」です。
MySQLだと先頭の100件取得するには以下の通り

SELECT * FROM table WHERE column = ? LIMIT 100 OFFSET 0;

LIMITで取得する件数、OFFSETで何件目から取得するかを指定です。カウントは0から始まるので0を指定すると1件目から。

これをOracleで行うと以下となります。

SELECT * FROM   
  (SELECT ROWNUM rownumber, t.column FROM 
    (SELECT column FROM table ORDER BY Column DESC) t
  ) 
WHERE rownumber BETWEEN 1 AND 100;

BETWEENを使う感じですね。いろいろ方法がありますがこれがいちばんわかりやすかった。
ROWNUMという予約語(疑似列と呼ぶようです)を使うと取得したデータに行番号を振ってくれます。
この行番号の何番から何番まで取得する、と指定して取得することになります。
MySQLに比べて副問い合わせ(サブクエリー)の副問い合わせ(サブクエリー)を行うのでこれってパフォーマンス大丈夫なの?と思いますがOracleってそもそもサブクエリーをどうやってうまく利用するかってところが重要になる言語でもあるのでOracle使いにとっては当たり前かもしれませんがやはりMySQLのSQLを見てもらうとあきらかにMySQLのほうがわかりやすいですね。

ちなみにMS SQL ServerだとSELECT TOP 100 と最初に「TOP 100」がMySQLのLIMIT指定と同じで取得する行数を制限させることができるので少し便利です。

参考サイト「大人になったら肺呼吸」さんのページ
http://d.hatena.ne.jp/replication/20130425/1366851622

コメントを残す