En una base de datos Oracle, ¿cuál es la diferencia entre ROWNUM y ROW_NUMBER?
-
05-07-2019 - |
Pregunta
Cuál es la diferencia entre ROWNUM
y ROW_NUMBER
?
Solución
ROWNUM es una " pseudocolumn " que asigna un número a cada fila devuelta por una consulta:
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 es una función analítica que asigna un número a cada fila de acuerdo con su orden dentro de un grupo de filas:
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
Otros consejos
De una pequeña lectura, ROWNUM es un valor asignado automáticamente por Oracle a un conjunto de filas (antes de que se evalúe ORDER BY, por lo que no nunca ORDER BY ROWNUM
o use un WHERE ROWNUM < 10
con un ORDER BY
).
ROW_NUMBER () parece ser una función para asignar números de fila a un conjunto de resultados devuelto por una subconsulta o partición.
Además de las otras diferencias mencionadas en las respuestas, también debe considerar el rendimiento. Aquí hay un informe no autoritativo pero muy interesante, que compara varios medios de paginación, entre los cuales el uso de ROWNUM
en comparación con ROW_NUMBER() OVER()
:
rownum es una pseudocolumna que se puede agregar a cualquier selección consulta, para numerar las filas devueltas (comenzando con 1). Se ordenan según el momento en que se identificaron como parte del conjunto de resultados final. ( #ref )
row_number es una función analítica, que puede ser usado para numerar las filas devueltas por la consulta en un orden ordenado por la función row_number ().
Rownum comienza con 1 .. aumenta después de que la condición evaluó los resultados como verdaderos. Por lo tanto, rownum & Gt; = 1 devuelve todas las filas de la tabla