ROWNUM
とはどう違いROW_NUMBER
ますか?
5 に答える
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が評価される前なので、決して ORDER BY ROWNUM
またはを使用WHERE ROWNUM < 10
しないでくださいORDER BY
)。
ROW_NUMBER()は、サブクエリまたはパーティションによって返される結果セットに行番号を割り当てるための関数のようです。
回答に記載されている他の違いとは別に、パフォーマンスも考慮する必要があります。ここには、権威はありませんが非常に興味深いレポートがあり、ページネーションのさまざまな手段をROWNUM
比較していROW_NUMBER() OVER()
ます。
rownumは、返される行に番号を付けるために、任意のselectクエリに追加できる疑似列です(1から始まります)。それらは、最終結果セットの一部であると識別された時期に従って順序付けられます。(#ref)
row_numberはアナリティックの関数であり、row_number()関数で指定された順序でクエリによって返された行に番号を付けるために使用できます。