機能
ROWNUMには、FROM句の結果の表に対して、WHERE句の探索条件を適用した結果の行に、1から振った順番号が入ります。
記述形式
一般規則
ROWNUMのデータ型は、精度が18、位取りが0のNUMERIC型です。
ROWNUMから値を読み込むことができますが、ROWNUMに対して値の挿入、更新はできません。
ROWNUMには、FROM句の結果の表に対して、WHERE句の探索条件を適用した結果の行に1から振った順番号が入ります。1件目の取り出しでは、ROWNUMに1が入り、2件目の取り出しでは、ROWNUMに2が入ります。以降、これを繰り返します。WHERE句に“ROWNUM < 件数”を指定すると、結果として取り出す件数を限定することができます。ただし、“ROWNUM > 2”などを指定すると、1件目取り出しの判定が常に偽となり、ROWNUMに2以上の値が入らないため、検索結果として取り出す件数は0件となります。
導出表にORDER BY句を指定する場合、ソート指定には、選択リストに指定していない値式を指定することはできません。
導出表にORDER BY句を指定する場合、ソート指定には、列指定または符号なし整数を指定しなければなりません。
WHERE句を適用した結果の行の順序に規則性はないので、ROWNUMの値と行の対応関係もそのときの取り出し順に依存します。
GROUP BY句、集合演算、またはORDER BY句は、ROWNUMに順番号を入れた後に行います。そのため、行の順が入れ代わり、ROWNUMの値の順に取り出すことができません。たとえば、ソートされたカーソルの先頭から、ある件数分を結果として取り出すような場合、ORDER BY句を導出表に指定し、その導出表を読み込むときにWHERE句にROWNUMを指定して件数を制限します。
ROWNUMは以下の箇所にのみ指定可能です。
SQL文 | |
---|---|
カーソル宣言 | 選択リスト |
導出表(カーソル宣言と同じ) | |
WHERE句 | |
副問合せ(カーソル宣言と同じ) | |
単一行SELECT文(カーソル宣言と同じ) | |
CREATE PROCEDURE文 | カーソル宣言 |
単一行SELECT文 |
使用例
在庫表から在庫数量が100以下の行を、先頭から5行分取り出します。
SELECT 製品番号,製品名,在庫数量 FROM 在庫管理.在庫表 WHERE 在庫数量 <= 100 AND ROWNUM < 6
在庫表から、製品番号が100から300の製品の数を求めます。ただし、50行を超える検索はしません。
SELECT COUNT(*) FROM 在庫管理.在庫表 WHERE 製品番号 BETWEEN 100 AND 300 AND ROWNUM < 51
在庫表から、製品番号が100から199で在庫数量が多い順に3行取り出します。
SELECT 製品番号,製品名,在庫数量,倉庫番号 FROM (SELECT 製品番号, 製品名,在庫数量,倉庫番号 FROM 在庫管理.在庫表 WHERE 製品番号 BETWEEN 100 AND 199 ORDER BY 在庫数量 DESC) AS D1(製品番号,製品名,在庫数量,倉庫番号) (1) WHERE ROWNUM < 4 (2)
(1) 在庫数量の降順にソートします。
(2) 在庫数量が多い順に3行取り出します。
在庫表から、製品番号が100から200の行を取り出し、取り出した行に1から順に番号を振ります。
SELECT ROWNUM AS "ROWNUM",製品番号,製品名,在庫数量 FROM 在庫管理.在庫表 WHERE 製品番号 BETWEEN 100 AND 200
在庫表から、製品番号が100から300の行の、先頭から11件目以降を取り出します。
SELECT 製品番号,行番号 FROM (SELECT 製品番号,ROWNUM FROM 在庫管理.在庫表 (1) WHERE 製品番号 BETWEEN 100 AND 300) AS D1(製品番号,行番号) WHERE 行番号 > 10 (2)
(1) 問合せの結果に対し、1から順に行番号を振ります。
(2) ROWNUMで振った行番号を判定します。
誤った使い方の例
SELECT 製品番号
FROM 在庫管理.在庫表 WHERE 製品番号 BETWEEN 100 AND 200 AND ROWNUM > 10
(1)
(1) 結果集合の行にROWNUMの値を1から順に振りますが、探索条件は常に偽になるため、2以上の値が振られることがありません。そのため、結果集合の行はすべて偽になり、検索結果は0件になります。
取引先などあるソートキーの昇順に画面を次々にめくっていくような場合、前回の続きから取り出します。
SELECT 行番号,取引先,取引製品,仕入価格 FROM (SELECT ROWNUM,取引先,取引製品,仕入価格 (3) FROM (SELECT 取引先,取引製品,仕入価格 FROM 在庫管理.発注表 WHERE 取引先 > 61 ORDER BY 取引先) AS D1(取引先,取引製品,仕入価格) (1) WHERE ROWNUM <= 10) (2) AS D2(行番号, 取引先,取引製品,仕入価格) WHERE 行番号 >= 6 (4)
(1) 取引先の昇順にソートします。
(2) 取引先が小さい順に10行取り出します。
(3) 取引先でソートした結果に1から順番号を振ります。
(4) 順番号について、6以上の行を取り出します。