【Oracle SQL*Plus】先頭から指定された行数(=レコード数)を表示:WHERE ROWNUM

雑学

備忘録になります。先頭から指定された行数(=レコード数)を表示させる場合はWHERE, 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 * 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

関連記事