Concepto De Rownum

De Dos Ideas.
Revisión del 12:21 11 ene 2011 de 88.2.211.117 (discusión) (Uso incorrecto del ROWNUM)
Saltar a: navegación, buscar

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.

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 <= 10;

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:

  1. En primer lugar se ejecuta la cláusula FROMWHERE
  2. ROWNUM es asignado e incrementado por cada fila resultante del FROMWHERE
  3. Se aplica el SELECT
  4. Se aplica el GROUP BY
  5. Se aplica el HAVING
  6. 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. dfgerterte

Ver también

Más información