Diferencia entre revisiones de «Concepto De Rownum»
(Página nueva: 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 ...) |
(→Ejemplo) |
||
(No se muestran 5 ediciones intermedias de 3 usuarios) | |||
Línea 1: | Línea 1: | ||
+ | [[Category:Oracle]] | ||
ROWNUM es una columna “mágica” en Oracle cuya utilidad mas frecuente es la siguiente: | ROWNUM es una columna “mágica” en Oracle cuya utilidad mas frecuente es la siguiente: | ||
Línea 4: | Línea 5: | ||
* Paginar a través de un query, típicamente en un ambiente stateless como es la web. | * 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. | 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. | ||
Línea 10: | Línea 11: | ||
==Top-N== | ==Top-N== | ||
− | =Sintaxis= | + | ===Sintaxis=== |
SELECT * FROM (nuestro query) | SELECT * FROM (nuestro query) | ||
WHERE ROWNUM <= N; | WHERE ROWNUM <= N; | ||
− | =Ejemplo= | + | ===Ejemplo=== |
SELECT * | SELECT * | ||
FROM (SELECT * FROM tabla ORDER BY id) | FROM (SELECT * FROM tabla ORDER BY id) | ||
− | WHERE ROWNUM <= | + | WHERE ROWNUM <= 8; |
==Paginación== | ==Paginación== | ||
− | =Sintaxis= | + | ===Sintaxis=== |
SELECT * FROM (SELECT /*+ FIRST_ROWS(n) */ *, ROWNUM rnum | SELECT * FROM (SELECT /*+ FIRST_ROWS(n) */ *, ROWNUM rnum | ||
FROM (nuestro query) | FROM (nuestro query) | ||
Línea 27: | Línea 28: | ||
WHERE rnum >= limite-inf; | WHERE rnum >= limite-inf; | ||
− | =Ejemplo= | + | ===Ejemplo=== |
SELECT * | SELECT * | ||
Línea 36: | Línea 37: | ||
− | + | =Reglas y Restricciones= | |
==Cómo trabaja ROWNUM== | ==Cómo trabaja ROWNUM== | ||
Línea 65: | Línea 66: | ||
− | + | =Uso incorrecto del ROWNUM= | |
SELECT * FROM tabla WHERE ROWNUM > 1; | SELECT * FROM tabla WHERE ROWNUM > 1; | ||
Línea 79: | Línea 80: | ||
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. | 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. | ||
− | + | =Ver también= | |
− | * [Oracle] | + | * [[Oracle]] |
− | + | =Más información= | |
*[http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html Ask Tom: On ROWNUM and Limiting Results] | *[http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html Ask Tom: On ROWNUM and Limiting Results] |
Revisión actual del 21:24 8 feb 2011
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.