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

¿Aplicar OFFSET y LIMIT en ORACLE para consultas de unión complejas?

Puede utilizar funciones analíticas como ROW_NUMBER() dentro de una subconsulta para Oracle 11g suponiendo que necesita clasificar las filas entre el 3.º y el 8.º para capturar el OFFSET 3 LIMIT 8 dentro de la base de datos de Oracle (de hecho, esas cláusulas se incluyen para las versiones 12c+ ), siempre que el resultado deba agruparse por CREATE_DATE y ordenado por el ID de los departamentos :

SELECT q.*
  FROM (SELECT DEPT.ID rowobjid,
               DEPT.CREATOR createdby,
               DEPT.CREATE_DATE createddate,
               DEPT.UPDATED_BY updatedby,
               DEPT.LAST_UPDATE_DATE updateddate,
               DEPT.NAME name,
               DEPT.STATUS status,
               statusT.DESCR statusdesc,
               REL.ROWID_DEPT1 rowidDEPT1,
               REL.ROWID_DEPT2 rowidDEPT2,
               DEPT2.DEPT_FROM_VAL parentcid,
               DEPT2.NAME parentname,
               ROW_NUMBER() OVER (PARTITION BY DEPT.CREATE_DATE ORDER BY DEPT.ID) AS rn
          FROM TEST.DEPT_TABLE DEPT
          LEFT JOIN TEST.STATUS_TABLE statusT
            ON DEPT.STATUS = statusT.STATUS
          LEFT JOIN TEST.C_REL_DEPT rel
            ON DEPT.ID = REL.ROWID_DEPT2
          LEFT JOIN TEST.DEPT_TABLE DEPT2
            ON REL.ROWID_DEPT1 = DEPT2.ID) q
 WHERE rn BETWEEN 3 AND 8;

que devuelve exactamente 6 (8-3+1) filas. Si necesita incluir los vínculos (los valores iguales para las identidades de departamento para cada fecha de creación), ROW_NUMBER() debe reemplazarse con otra función de ventana llamada DENSE_RANK() ya que todas las demás partes de la consulta siguen siendo las mismas. Al menos 6 los registros regresarían en este caso.