ROWNUM
とROW_NUMBER
の違いは何ですか?
ROWNUMは、クエリによって返される各行に番号を割り当てる「疑似列」です。
SQL> select rownum, ename, deptno
2 from emp;
ROWNUM ENAME DEPTNO
---------- ---------- ----------
1 SMITH 99
2 ALLEN 30
3 WARD 30
4 JONES 20
5 MARTIN 30
6 BLAKE 30
7 CLARK 10
8 SCOTT 20
9 KING 10
10 TURNER 30
11 FORD 20
12 MILLER 10
ROW_NUMBERは、行のグループ内の順序に従って各行に番号を割り当てる分析関数です。
SQL> select ename, deptno, row_number() over (partition by deptno order by ename) rn
2 from emp;
ENAME DEPTNO RN
---------- ---------- ----------
CLARK 10 1
KING 10 2
MILLER 10 3
FORD 20 1
JONES 20 2
SCOTT 20 3
ALLEN 30 1
BLAKE 30 2
MARTIN 30 3
TURNER 30 4
WARD 30 5
SMITH 99 1
少し読んだだけで、ROWNUMはOracleによって行セットに自動的に割り当てられる値です(ORDER BYが評価される前なので、everORDER BY ROWNUM
またはWHERE ROWNUM < 10
とORDER BY
を使用します)。
ROW_NUMBER() は、サブクエリまたはパーティションによって返される結果セットに行番号を割り当てるための関数のようです。
回答に記載されている他の違いとは別に、パフォーマンスも考慮する必要があります。ここには、信頼できないが非常に興味深いレポートがあり、ページ付けのさまざまな手段を比較しています。その中で、ROWNUM
の使用とROW_NUMBER() OVER()
の使用は次のとおりです。