アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

OracleでのLIMITの記述あれこれ

こんにちは。Oracle挑戦中の松田です。
今までまったく触ったことのなかったOracleに初めて触れ、頭が混乱中なので備忘録がわりにブログに書き留めておきます。

特に悩んだのがLIMIT関連。
何故かOracleってLIMITが無いんですね。LIMITに慣れていると、なぜ存在していないのかが不思議でしょうがありません。ほんとどうしてなんでしょ?

・memberテーブルから LIMIT 10 で結果取得


SELECT 
  * 
FROM 
  member 
WHERE 
  ROWNUM <= 10

ROWNUM ・・・ 抽出した結果セットに勝手に付けられるレコード番号
基本はこれを使って結果セットの切り分けをするらしい。


・memberテーブルから LIMIT 10, OFFSET 5 で結果取得


SELECT 
  *
FROM
  (
    SELECT 
      id, category, age, ROWNUM line
    FROM
      member
  )
WHERE
  line BETWEEN 6 AND 16

サブクエリ内でいったんROWNUMを付けておき、それをBETWEENで範囲指定して取得する。


・memberテーブルから、グループ(category)ごとに最も年齢(age)の高い人をそれぞれ取得


SELECT 
  * 
FROM 
  (
    SELECT 
      id, age, category,
      rank() OVER (PARTITION BY category ORDER BY age DESC) as rank 
    FROM 
      member
  ) rn 
WHERE 
  rn.rank = 1

rank() over ~ の行で各カテゴリごとにランキングの数値を付ける。
後にそのランキングが1位のものを rn.rank = 1 で指定して取ってくる。


とりあえずこれだけ。
もうここまででものすごく頭が痛いです。
正直まったくピンと来てませんが、最後の例はMySQLだと記述方法がパッっと思いつかないので覚えられれば便利なのかも。

実際に仕事で使ったテーブルを架空のテーブルに置き換えて記述しなおしているので、実際動くかどうかは若干不安です。