Oracle
 sql >> Base de données >  >> RDS >> Oracle

Appliquer OFFSET et LIMIT dans ORACLE pour les requêtes de jointure complexes ?

Vous pouvez utiliser des fonctions analytiques telles que ROW_NUMBER() dans une sous-requête pour Oracle 11g en supposant que vous devez obtenir les lignes classées entre la 3ème et la 8ème afin de capturer le OFFSET 3 LIMIT 8 logique dans la base de données Oracle (en effet, ces clauses sont incluses pour les versions 12c+ ), chaque fois que le résultat doit être regroupé par CREATE_DATE et classé par ID des départements :

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;

qui renvoie exactement 6 (8-3+1) rangées. Si vous devez inclure les liens (les valeurs égales pour les identités de service pour chaque date de création), ROW_NUMBER() doit être remplacé par une autre fonction de fenêtre appelée DENSE_RANK() car toutes les autres parties de la requête restent les mêmes. Au moins 6 les enregistrements reviendraient dans ce cas.