argius note

プログラミング関連

Oracle 行情報を扱う擬似列(ROW,ROWNUM)

行についての情報を扱う擬似列についてのメモです。

  • ROWID
  • ROWNUMとROW_NUMBER()
  • 擬似列と*を併用するには


Oracleに限ったことではありませんが、DBMSにはメタデータ的な情報を列として扱うための仕掛けがあります。これを「擬似列」といいます。


例えば、"ROWID"。ROWIDは、オブジェクトの中で行をユニークに特定できるIDです。この値は実際のデータのアドレスを示すポインタだそうで、PRIMARY KEYなどのユニークキーが無くても行を特定できるキーとなっています。
ROWIDでのアクセスは、単一行取得(UNIQUE SCAN)の場合は最も速いのですが、IN句などで複数行取得する場合はそうとは限らないので気をつけましょう。


ROWNUMは、検索結果に行番号を付加できます。

SELECT * FROM TABLE1 WHERE ROWNUM < 101;

のようにすると、取得する件数を制限(この場合は最大100件)することができます。
ただし、ROWNUMは毎回同じ行に同じ番号が振られるとは限らないのと、途中を抜き出すことができません。たとえば、ページ制御で「1ページ目:1〜50件目」「2ページ目:51〜100件目」のようにしたい場合には使えません。この場合は、ROW_NUMBER()を使用します。

(例)1ページ20件の一覧表示で、2ページ目に表示するデータを取得する
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ID) AS SEQ, COLUMN1, COLUMN2 )
 WHERE SEQ BETWEEN 21 AND 40;


もうひとつ。"SELECT * FROM TABLE1 ..."の取得する列に"ROWID"をつけたい場合は、

SELECT ROWID,* FROM TABLE1 ...

とすると、エラーとなってしまいます(ORA-00936:式がありません)。
この場合は、*にテーブル名を修飾すればOKです。(知らなかった...)

SELECT ROWID,T1.* FROM TABLE1 T1 ...