Oracle
 sql >> Database >  >> RDS >> Oracle

Applicare OFFSET e LIMIT in ORACLE per query di join complesse?

Puoi utilizzare funzioni analitiche come ROW_NUMBER() all'interno di una sottoquery per Oracle 11g supponendo che sia necessario ottenere le righe classificate tra la 3a e l'8a per acquisire OFFSET 3 LIMIT 8 logica all'interno del DB Oracle(infatti quelle clausole sono incluse per le versioni 12c+ ), ogni volta che il risultato deve essere raggruppato per CREATE_DATE e ordinato per ID dei dipartimenti :

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;

che restituisce esattamente 6 (8-3+1) righe. Se devi includere le cravatte (i valori uguali per le identità di reparto per ogni data di creazione), ROW_NUMBER() dovrebbe essere sostituito con un'altra funzione della finestra chiamata DENSE_RANK() poiché tutte le altre parti della query rimangono le stesse. Almeno 6 i record verrebbero restituiti in questo caso.