【DataBase】Oracleで疑似的にLimit句を実行

Database

PostgreSQLやMySQLを使用されている方は、ちょこっとデータを確認したいときに「Limit句」を使うことがあるのではないかと思います。けれど、Oracleではサポートされていないようで…。

久々にOracle使ったら、Limit句使えなくて悲しかったので…・

それでもLimit句のような結果が見たいんだ!

はじめに

こんな人向け

  • Oracleのデータベース使っている方
  • レコード数が多いテーブルを取り扱うシステムに携わっている方
  • 上にあてはまっていて、少しのレコードだけ見れれば良い方

大まかな内容

  • ORACLEの検索結果には「ROWNUM」って列が含まれているってこと。
  • ROWNUM列を利用して結果セットのうち3行のみ取得する構文の例示。
  • 上の応用:副問い合わせを使った上位3行取得の例示。

記事にしようと思った背景

最近は専らPostgreSQLに触れている時間が長く、テーブル数も割と多めのシステムで作業中のせいかLimit句の利用が大幅に増えていました。

そんな中、久しぶりに触れたOracleを使ったシステム。

どんなデータが入っているのかな?数行だけ見よう…

構文エラー!!Limitってなぁに?

…あぁLIMIT句、使えないのですね。とはいえ数万行のデータを眺める気にもならないので、似たようなことができないかを探したのがきっかけです。

疑似的なLimit句の実行

テーブルの準備

以下のような「動物テーブル(animals)」を用意して、クエリ例を記述していきます。

種類(kind)名前(name)
ネズミヌードル
ウシラーメン
トラウドン
ウサギソバ
コアラホウトウ

ROWNUM

Oracleでは結果セットに「ROWNUM」という疑似列が付与されている。たとえば、以下のようなSQLを発行してみます。

SELECT kind, name FROM animals;

下が実行結果となります。

ROWNUM 種類(kind) 名前(name)
1ネズミヌードル
2ウシラーメン
3トラウドン
4ウサギソバ
5コアラホウトウ

SELECT句に指定はしていませんし、実際に結果で表示はされないのですが、見えないところでは検索結果に「ROWNUM」列を付与した形でデータ操作されています。

上位3レコード取り出す

取得順などを気にしないのであれば、次のように書けばOK。(取得結果は上の表と同じとします)

SELECT kind, name FROM animals WHERE ROWNUM <= 3;

種類(kind) 名前(name)
ネズミヌードル
ウシラーメン
トラウドン

順序付けされた上位3レコード取り出す

副問い合わせを使って表を作成することで、ソート後の結果から決まったレコード数を取り出すことが実現可能です。

SELECT
  *
FROM
  (SELECT * FROM animals ORDER BY name)
WHERE
 ROWNUM <= 3;

ROWNUMの注意点

「ROWNUM」は結果セットの取り出し順に付与されるため、副問い合わせを用いずにソートした結果から上位3件取得しようとすると想定と異なる結果になることが多々あると思います。

  1. 取得結果に番号を付与する
  2. ソートする (この時にROWNUMの再採番はされない)

最後に

Limit句をサポートしているDBMSではラクチン

Limit句が使えるDBMS(PostgreSQLやMySQL)では以下のように記述すればOK。

SELECT * FROM animals limit 3;

表の仕様を意識しなくても使えるので楽ですね。

参考リンク

SHIFT the Oracle:ROWNUM 擬似列

ROWNUM - オラクル・Oracleをマスターするための基本と仕組み
ROWNUM を使用して取り出すレコード数を制限する:ROWNUM 擬似列の特徴は - ソート前の抽出した結果セットのレコード番号をあらわす。- WHERE 条件に入れることでレコード数を制限できる。(オプティマイザに助言をあたえている)-...

もっと詳しくROWNUM疑似列の仕様を知りたい方向け

コメント

タイトルとURLをコピーしました