Oracle/PLSQL: Recuperar N registros intermedios de la consulta

Los datos expuestos en este blog, son solo de índole informativo. Por favor realiza siempre una copia de seguridad antes de realizar cualquier cambio en tu proyecto.

Oracle/PLSQL: Recuperar N registros intermedios de la consulta

Pregunta: ¿Cómo puedo recuperar los N registros intermedios de la consulta?

Por ejemplo, si quiero recuperar los registros 3 a 5 de los resultados de la consulta. ¿Cómo puedo hacer esto?

Respuesta: para recuperar los N registros centrales de una consulta, puede usar la siguiente sintaxis:

SELECT *
FROM (select alias_name.*, rownum rnum from
               (-- your ordered query --) alias_name
      where rownum <= UPPER_BOUND )
WHERE rnum >= LOWER_BOUND;

Por ejemplo, si quisiera recuperar los registros del 3 al 5 de la tabla de proveedores, ordenados en orden ascendente por nombre del proveedor, ejecutaría la siguiente consulta:

SELECT *
FROM (select suppliers2.*, rownum rnum from
               (select * from suppliers ORDER BY supplier_name) suppliers2
                where rownum <= 5 )
WHERE rnum >= 3;

Si quisiera recuperar los registros del 3 al 5 de la tabla de proveedores, ordenados por nombre de proveedor en orden descendente, ejecutaría la siguiente consulta:

SELECT *
FROM (select suppliers2.*, rownum rnum from
               (select * from suppliers ORDER BY supplier_name DESC) suppliers2
                where rownum <= 5 )
WHERE rnum >= 3;

Si quisiera recuperar los registros del 2 al 4 de la tabla de proveedores, ordenados por ID de proveedor en orden ascendente, ejecutaría la siguiente consulta:

SELECT *
FROM (select suppliers2.*, rownum rnum from
               (select * from suppliers ORDER BY supplier_id) suppliers2
                where rownum <= 4 )
WHERE rnum >= 2;

Si quisiera recuperar los registros del 2 al 4 de la tabla de proveedores, ordenados por ID de proveedor en orden descendente, ejecutaría la siguiente consulta:

SELECT *
FROM (select suppliers2.*, rownum rnum from
               (select * from suppliers ORDER BY supplier_id DESC) suppliers2
                where rownum <= 4 )
WHERE rnum >= 2;