sql >> Base de Datos >  >> RDS >> Oracle

Consultas Top-N y paginación en Oracle

Las consultas Top-N y la paginación son comunes en las aplicaciones basadas en web. El usuario ingresa un conjunto de criterios, que ejecuta una consulta y luego le permite al usuario hacer clic en los botones Anterior y Siguiente para recorrer el conjunto de resultados. Para lograr esta función de paginación, la aplicación debe poder obtener un determinado conjunto de filas de la consulta de la base de datos.

Echemos un vistazo a los diferentes métodos en Oracle para lograr consultas Top-N en Oracle y Paginación en la consulta de Oracle

Pre12c

(1) Uso de la cláusula ROWNUM

¿Qué es ROWNUM?
Es una pseudocolumna (no una columna real) que está disponible en una consulta. A ROWNUM se le asignarán los números 1, 2, 3, 4, … N , donde N es el número de filas en el conjunto con el que se utiliza ROWNUM. Un valor ROWNUM no se asigna de forma permanente a una fila.

Esta es la forma de obtener los 5 valores principales

SELECT *
FROM (SELECT *
FROM dept
ORDER BY sales DESC)
WHERE ROWNUM <= 5;

Esta versión ordenará el departamento por ventas descendentes y luego devolverá los primeros cinco registros que encuentre (los primeros cinco registros).
Para la paginación en Oracle, si desea los 5-10 registros del departamento ordenado por ventas desc entonces ve por esto.

SELECT a.*
FROM (SELECT ROWNUM rn, b.*
FROM ( SELECT *
FROM dept
ORDER BY sales dsc) b  where rn <=10) a
WHERE a.rn >= 5

La sintaxis general sería

select *
from
( select rownum rnum, a.*
from (your_query) a
where rownum <= M )
where rnum >= N;

(2) Uso de la función analítica de Oracle ROW_NUMBER():se comporta de manera similar a la pseudocolumna ROWNUM pero es más flexible y tiene más capacidades

Esta es la forma de obtener los 5 valores principales

SELECT *
FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Aquí está la consulta de Paginación

SELECT * FROM (
SELECT
d.*,
row_number() over (ORDER BY d.sales DSC) rn
FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;

Las N consultas principales anteriores devolverán registros diferentes cuando dos cosas empataron en el mismo lugar al usar las n consultas principales

SELECT *
FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Esta es la forma de obtener los 5 valores principales usando dense_rank

SELECT *
FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Con 12c

Función Top-N :

Oracle Database 12c incluye compatibilidad con las cláusulas FETCH FIRST/NEXT y OFFSET del estándar ANSI, que en conjunto se denominan cláusula de limitación de filas. Esta cláusula le permite recuperar fácilmente los primeros N registros de un conjunto de resultados o, alternativamente, los primeros N registros después de omitir un conjunto de registros, para que pueda paginar fácilmente a través de un conjunto de resultados

Una consulta Top-N nos permite recuperar las N filas superiores o inferiores de un conjunto ordenado. La combinación de dos consultas Top-N le brinda la posibilidad de navegar a través de un conjunto ordenado

Ejemplo:

SELECT value
FROM mytable
ORDER BY value DESC
FETCH FIRST 10 ROWS ONLY;  

select * from my_test order by name fetch first 3 rows only;

Si observa el plan del optimizador para la consulta anterior, todavía está usando row_number() en el envoltorio para hacerlo

La paginación también puede ocurrir con esta función con la sintaxis de desplazamiento de uso

– desplazar 10 filas buscar solo las primeras 10 filas

select * from my_test order by id
offset 10 rows fetch next 10 rows only;

– el desplazamiento de 10 filas obtiene solo las primeras filas del 0,1 por ciento

select * from my_test order by id offset 10 rows first 0.1 percent rows only;

– desplazar 10 filas buscar las primeras 3 filas con empates. Significa que todas las filas superiores con vínculos también se incluirán en el resultado

select * from my_test order by name fetch first 3 rows with ties;

Si verifica el plan del optimizador de la consulta anterior, encontrará que el optimizador está usando la función rank() como se demostró anteriormente en el caso Pre 12c

Restricción
(1) Si tiene una sentencia SELECT con FOR UPDATE, no puede usarla.
(2) La sentencia SELECT no puede CURRVAL o NEXTVAL de secuencias
(3) Si la consulta de las vistas materializadas tiene esta cláusula, entonces no puede hacer una actualización incremental de esa vista materializada

Espero que les guste el artículo sobre Consultas Top-N en Oracle y Paginación en Oracle Query. Por favor proporcione comentarios

También lee
Función principal en Oracle
Función RANK en Oracle
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html