【Oracle SQL*Plus】レコード行番号:ROWNUM

雑学

備忘録になります。ROWNUMはレコード行番号を示します。

SQL> SELECT * FROM TEST_TABLE;
         2,NAME-B    ,         2,B
         3,NAME-C    ,         3,C
         4,NAME-D    ,         4,D
         5,NAME-E    ,         5,E
         1,NAME-A    ,         1,A

SQL> SELECT ROWNUM FROM TEST_TABLE;
         1
         2
         3
         4
         5

ROWNUMを使うケースとして、行番号指定での表示に利用します。

SQL> SELECT * FROM TEST_TABLE
  2 WHERE ROWNUM <= 3;
         2,NAME-B    ,         2,B
         3,NAME-C    ,         3,C
         4,NAME-D    ,         4,D

注意点としてWHERE句に利用する場合、ORDER BYやGROUP BYより優先順位が高いため、ソート後やグループ化後の結果に対しての行番号を使いたい場合は工夫が必要です。

SQL> SELECT * FROM TEST_TABLE
  2  ORDER BY ID;
         1,NAME-A    ,         1,A
         2,NAME-B    ,         2,B
         3,NAME-C    ,         3,C
         4,NAME-D    ,         4,D
         5,NAME-E    ,         5,E

SQL> SELECT * FROM TEST_TABLE
  2  WHERE ROWNUM <= 3
  3  ORDER BY ID;
         2,NAME-B    ,         2,B
         3,NAME-C    ,         3,C
         4,NAME-D    ,         4,D

上記クエリは項目名:IDが1~3のレコードを表示させたいが、ソートが効かず、2~4が表示されています。解決法として、私はサブクエリを使って回避しています。

SQL> SELECT * FROM (
  2    SELECT * FROM TEST_TABLE
  3    ORDER BY ID)
  4  WHERE ROWNUM <= 3;
         1,NAME-A    ,         1,A
         2,NAME-B    ,         2,B
         3,NAME-C    ,         3,C

関連記事