Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wenden Sie OFFSET und LIMIT in ORACLE für komplexe Join-Abfragen an?

Sie können Analysefunktionen wie ROW_NUMBER() verwenden innerhalb einer Unterabfrage für Oracle 11g Angenommen, Sie müssen die Reihen zwischen 3. und 8. platzieren, um OFFSET 3 LIMIT 8 zu erfassen Logik innerhalb der Oracle DB (tatsächlich sind diese Klauseln für die Versionen 12c+ enthalten ), wenn das Ergebnis nach CREATE_DATE gruppiert werden soll und nach der ID geordnet der Abteilungen :

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;

was genau 6 zurückgibt (8-3+1) Reihen. Wenn Sie die Bindungen (die gleichen Werte für Abteilungsidentitäten für jedes Erstellungsdatum) einschließen müssen, ROW_NUMBER() sollte durch eine andere Fensterfunktion namens DENSE_RANK() ersetzt werden da alle anderen Teile der Abfrage gleich bleiben. Mindestens 6 Datensätze würden in diesem Fall zurückgegeben.