Concepto De Rownum
ROWNUM es una columna “mágica” en Oracle cuya utilidad mas frecuente es la siguiente:
- Realizar un procesamiento de las Top-N filas de un query. Esto es similar al uso de la cláusula LIMIT disponible en otras bases de datos.
- Paginar a través de un query, típicamente en un ambiente stateless como es la web.
Contenido
Ejemplos de paginación de resultados
Utilizamos el ROWNUM fuera del query que deseamos obtener las N primeras filas o en el caso un poco mas complejo de la paginación.
Top-N
Sintaxis
SELECT * FROM (nuestro query) WHERE ROWNUM <= N;
Ejemplo
SELECT * FROM (SELECT * FROM tabla ORDER BY id) WHERE ROWNUM <= 8;
Paginación
Sintaxis
SELECT * FROM (SELECT /*+ FIRST_ROWS(n) */ *, ROWNUM rnum FROM (nuestro query) WHERE ROWNUM <= limite-sup) WHERE rnum >= limite-inf;
Ejemplo
SELECT * FROM (SELECT /*+ FIRST_ROWS(10) */ a.*, ROWNUM rnum FROM (SELECT id, dato FROM tabla ORDER BY id, rowid) a WHERE ROWNUM <= 20) WHERE rnum >= 10;
Reglas y Restricciones
Cómo trabaja ROWNUM
ROWNUM es una pseudo-columna (no una columna real) que esta disponible en un query. Esto quiere decir que al conjunto de filas resultante de un query se le asigna un número virtual que va de 1 a N.
Con esto debe quedar claro que el ROWNUM no es un valor asignado permanentemente a una fila de una tabla, sino que es un número que se asigna dinámicamente a las filas resultantes de un query.
El ROWNUM es un valor asignado a una fila LUEGO que pasa la fase del predicado del query, pero ANTES que el query realice cualquier sort o agrupamiento.
Además, el ROWNUM es un valor que se incrementa solo luego de que es asignado (siempre tiene que pasar por el valor 1 para poder avanzar en la asignación).
Orden de asignacion del ROWNUM
SELECT *, ROWNUM FROM tabla WHERE <cláusula where> GROUP BY <columnas> HAVING <cláusula having> ORDER BY <columnas>;
Es procesado en el siguiente orden:
- En primer lugar se ejecuta la cláusula FROMWHERE
- ROWNUM es asignado e incrementado por cada fila resultante del FROMWHERE
- Se aplica el SELECT
- Se aplica el GROUP BY
- Se aplica el HAVING
- Se aplica el ORDER BY
Uso incorrecto del ROWNUM
SELECT * FROM tabla WHERE ROWNUM > 1;
Este query no funciona porque no se logra realizar ninguna asignación, ya que ROWNUM > 1 no es “true” para la primera fila.
SELECT * FROM empleados WHERE ROWNUM <= 5 ORDER BY salario DESC;
Aunque la intensión era traer los 5 empleados mejor pagos, lo que este query retorna son 5 filas aleatorias (las primeras 5 que el FROMWHERE trae) ordenadas por salario.