Saltar al contenido
Codifíca.me | Desarrollo web | Programación

ROWNUM

21 septiembre, 2010

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 DESC

DNI                  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;