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

OracleでのLIMITの記述あれこれ

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

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

・memberテーブルから LIMIT 10 で結果取得
  1. SELECT 
  2.   * 
  3. FROM 
  4.   member 
  5. WHERE 
  6.   ROWNUM <= 10
ROWNUM ・・・ 抽出した結果セットに勝手に付けられるレコード番号
基本はこれを使って結果セットの切り分けをするらしい。


・memberテーブルから LIMIT 10, OFFSET 5 で結果取得
  1. SELECT 
  2.   *
  3. FROM
  4.   (
  5.     SELECT 
  6.       id, category, age, ROWNUM line
  7.     FROM
  8.       member
  9.   )
  10. WHERE
  11.   line BETWEEN 6 AND 16
サブクエリ内でいったんROWNUMを付けておき、それをBETWEENで範囲指定して取得する。


・memberテーブルから、グループ(category)ごとに最も年齢(age)の高い人をそれぞれ取得
  1. SELECT 
  2.   * 
  3. FROM 
  4.   (
  5.     SELECT 
  6.       id, age, category,
  7.       rank() OVER (PARTITION BY category ORDER BY age DESC) as rank 
  8.     FROM 
  9.       member
  10.   ) rn 
  11. WHERE 
  12.   rn.rank = 1
rank() over ~ の行で各カテゴリごとにランキングの数値を付ける。
後にそのランキングが1位のものを rn.rank = 1 で指定して取ってくる。


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

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

コメント

    • MySQLはどうか知りませんが、
      Oracleの場合、取得した結果セットの並びは保証されていないので、
      order byで並び替えておかないと、正しく取得できない目にあいますよ。
    • >とおりすがりさん
      ま、まじっすかっ!
      それも知らなかったです。。ありがとうございました。
      まだまだ奥が深いです・・・。

コメントフォーム

認証
captcha_key
 

トラックバック