Oracle SQL 関数 : ROWNUM : 行順序の疑似列

ROWNUM疑似列 はSQLの関数ではないのですが、ここで説明します。

  ROWNUM疑似列は、問合せによって戻される各行について、
  表や結合処理された行の集合からOracleが行を選択する順序を示す番号を戻します。
  選択される最初の行のROWNUMは1、2番目の行のROWNUMは2です(以降同様に続きます)。

  ROWNUM疑似列は問合せ結果に含まれるカラムの様に利用できることになります。


以下に ROWNUM疑似列 を使って検索結果の行数を制限する例を示します。
取敢えず ROWNUM疑似列 も表示させています。

SQL> SELECT 商品コード, 商品名, ROWNUM
  2  FROM TM_商品
  3  WHERE ROWNUM < 5;

商品コード 商品名                                                               ROWNUM
---------- ---------------------------------------------------------------- ----------
         1 PC-9001                                                                   1
         2 PC-9002                                                                   2
         3 PC-9003                                                                   3
         4 NOTE-1010                                                                 4

この問い合わせに ORDER BY 句を追加すると問合せ結果をさらに並び替えを行うことになり、 以下の様に表示順番が変わります。

SQL> SELECT 商品コード, 商品名, ROWNUM
  2  FROM TM_商品
  3  WHERE ROWNUM < 5
  4  ORDER BY 商品名;

商品コード 商品名                                                               ROWNUM
---------- ---------------------------------------------------------------- ----------
         4 NOTE-1010                                                                 4
         1 PC-9001                                                                   1
         2 PC-9002                                                                   2
         3 PC-9003                                                                   3

上の例では ORDER BY 句までの問い合わせで毎回同じ結果が得られるとは限らないので、 ORDER BY 句を含めた問合せを 副問合せ として FROM 句の中に記述して WHERE 句で ROWNUM の条件付けを行うことで意図した順番になります。

以下の例は「仕入単価」でソートした結果から、先頭4行を取得しています。

SQL> SELECT 商品コード, 商品名, 仕入単価
  2  FROM (
  3      SELECT *
  4      FROM TM_商品
  5      ORDER BY 仕入単価
  6  )
  7  WHERE ROWNUM < 5;

商品コード 商品名                                                             仕入単価
---------- ---------------------------------------------------------------- ----------
        11 HUB-A001                                                              20000
        12 HUB-B001                                                              40000
         7 PRT-3001                                                              45000
         9 CRT-1001                                                              45000


この方法を使えば、欲しい問い合わせを FROM 句に記述し、「上位N件」を取得することができます。

また ROWNUM はそれぞれの問い合わせで有効なので、以下の様にしても正しく動作します。

SQL> SELECT *
  2  FROM (
  3      SELECT
  4           0 AS 商品コード, 'AAA' AS 商品名
  5      FROM DUAL
  6      UNION
  7      SELECT 商品コード, 商品名
  8      FROM (
  9          SELECT *
 10          FROM TM_商品
 11          ORDER BY 商品コード
 12      )
 13      WHERE ROWNUM < 11
 14  )
 15  WHERE ROWNUM < 6;

商品コード 商品名
---------- ----------------------------------------------------------------
         0 AAA
         1 PC-9001
         2 PC-9002
         3 PC-9003
         4 NOTE-1010