ROWNUM は、クエリから行が取得される順序に基づいて、各行に一意かつ増分の整数を割り当てる擬似列です。最初に取得された行には ROWNUM 1 が、2 番目の行には ROWNUM 2 が割り当てられ、以降も同様に続きます。
仕組み
ROWNUM の値は、ソートより前に割り当てられます。ORDER BY 句を含むクエリでは、結果セットが指定された順序で返されますが、ROWNUM の値はソート後の順序ではなく、元の取得順序を反映します。
クエリが返す行数の制限
WHERE 句で ROWNUM を使用して、クエリが返す行数を上限付きで制限できます。
SELECT empno, ename, job FROM emp WHERE ROWNUM < 5;出力結果:
empno | ename | job
-------+-------+----------
7369 | SMITH | CLERK
7499 | ALLEN | SALESMAN
7521 | WARD | SALESMAN
7566 | JONES | MANAGER
(4 rows)ROWNUM と ORDER BY の併用
ROWNUM はソート前に割り当てられるため、同じクエリレベルで ROWNUM と ORDER BY を併用すると、ROWNUM の値はソートされていない状態になります。
SELECT ROWNUM, empno, ename, job FROM emp WHERE ROWNUM < 5 ORDER BY ename;出力結果:
rownum | empno | ename | job
--------+-------+-------+----------
2 | 7499 | ALLEN | SALESMAN
4 | 7566 | JONES | MANAGER
1 | 7369 | SMITH | CLERK
3 | 7521 | WARD | SALESMAN
(4 rows)行は ename でソートされていますが、ROWNUM の値(2、4、1、3)は元の取得順序を反映しています。
ROWNUM を使用した連番の割り当て
UPDATE 文で ROWNUM を使用して、既存の行に連番を割り当てることができます。以下の例では、seqno 列を jobhist テーブルに追加し、その列に値を設定します。
ALTER TABLE jobhist ADD seqno NUMBER(3);
UPDATE jobhist SET seqno = ROWNUM;結果を確認します。
SELECT seqno, empno, TO_CHAR(startdate,'DD-MON-YY') AS start, job FROM jobhist;出力結果:
seqno | empno | start | job
-------+-------+-----------+-----------
1 | 7369 | 17-DEC-80 | CLERK
2 | 7499 | 20-FEB-81 | SALESMAN
3 | 7521 | 22-FEB-81 | SALESMAN
4 | 7566 | 02-APR-81 | MANAGER
5 | 7654 | 28-SEP-81 | SALESMAN
6 | 7698 | 01-MAY-81 | MANAGER
7 | 7782 | 09-JUN-81 | MANAGER
8 | 7788 | 19-APR-87 | CLERK
9 | 7788 | 13-APR-88 | CLERK
10 | 7788 | 05-MAY-90 | ANALYST
11 | 7839 | 17-NOV-81 | PRESIDENT
12 | 7844 | 08-SEP-81 | SALESMAN
13 | 7876 | 23-MAY-87 | CLERK
14 | 7900 | 03-DEC-81 | CLERK
15 | 7900 | 15-JAN-83 | CLERK
16 | 7902 | 03-DEC-81 | ANALYST
17 | 7934 | 23-JAN-82 | CLERK
(17 rows)