Rownum es una pseudocolumna (no es real). Es un número virtual que se le asigna a los regitros devueltos por una select.
Hay que tener claro que no es un valor asignado permanentemente a una fila, por eso no podemos ejecutar la siguiente sentencia, ya que no es cierto que rownum sea 1 para la primera fila:
select * from PRUEBA where rownum = 1;
Cuando ejecutamos una sentencia se numera las filas del resultado asignándole al primer registro el valor para el rownum de 1 y el resto se va incrementando en 1. Se hace siempre que una fila pase por el FROM/WHERE de la tabla, antes que realice ninguna agrupación u ordenación.
Si tenemos este tipo de consulta:
select …, ROWNUM from PRUEBA
where [condiciones]
group by [campos]
having [condicion]
order by [campo]Este sería el orden en el que se realiza:
1. Se ejecuta la cláusula FROMWHERE
2. Se asigna el ROWNUM y se incrementa por cada fila que devuelva el FROMWHERE.
3. Aplica el SELECT
4. Aplica el GROUP BY
5. Aplica el HAVING
6. Aplica el ORDER BY
Vamos a verlo con un ejemplo. Si continuamos con la tabla de PRUEBA:
DNI DEPARTAMENTO
——————– ——————–
0001 Contabilidad
0001 Diseño
0002 Contabilidad
0003 Ventas
0002 Contabilidad
0006 Informatica
0007 Contabilidad
0007 Contabilidad
0007 Contabilidad
0003 Diseño
0005 Diseño
0005 Diseño
0005 Contabilidad
Ahora intento recuperar 3 DNI por orden descendente:
SELECT *
FROM prueba
WHERE ROWNUM <= 3
ORDER BY dni DESCDNI DEPARTAMENTO
——————– ——————–
0002 Contabilidad
0001 Contabilidad
0001 Diseño
Recupera las tres primeras filas ALEATORIAS que devuelve el FROM/WHERE y luego las ordena.
La select debería ordenar y luego recuperar los tres registros de esta manera:
select * from(SELECT *
FROM prueba
ORDER BY dni DESC)
WHERE ROWNUM <= 3;DNI DEPARTAMENTO
——————– ——————–
0007 Contabilidad
0007 Contabilidad
0007 Contabilidad
Y ahora aquí os dejo una select para paginar registros utilizando el ROWNUM:
select *
from ( select
a.*, ROWNUM rnum
from ( select * from PRUEBA
order by 1) a
where ROWNUM <= REGISTROFINAL ) where rnum >= REGISTROINICIAL;