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件取得しようとすると想定と異なる結果になることが多々あると思います。
- 取得結果に番号を付与する
- ソートする (この時にROWNUMの再採番はされない)
最後に
Limit句をサポートしているDBMSではラクチン
Limit句が使えるDBMS(PostgreSQLやMySQL)では以下のように記述すればOK。
SELECT * FROM animals limit 3;
表の仕様を意識しなくても使えるので楽ですね。
参考リンク
SHIFT the Oracle:ROWNUM 擬似列
もっと詳しくROWNUM疑似列の仕様を知りたい方向け
コメント