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

Vil du anvende OFFSET og LIMIT i ORACLE til komplekse deltagelsesforespørgsler?

Du kan bruge analytiske funktioner såsom ROW_NUMBER() i en underforespørgsel til Oracle 11g forudsat at du har brug for at få rækkerne rangeret mellem 3. og 8. for at fange OFFSET 3 LIMIT 8 logik i Oracle DB(de klausuler er faktisk inkluderet for versioner 12c+ ), når resultatet skal grupperes efter CREATE_DATE og sorteret efter ID af afdelingerne :

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;

som returnerer præcis 6 (8-3+1) rækker. Hvis du skal inkludere bindingerne (de ens værdier for afdelingsidentiteter for hver oprettelsesdato), ROW_NUMBER() bør erstattes med en anden vinduesfunktion kaldet DENSE_RANK() da alle andre dele af forespørgslen forbliver de samme. Mindst 6 optegnelser ville returnere i dette tilfælde.




  1. Sådan opretter du en database i MySQL

  2. Hvordan ændrer du datatypen for en kolonne i SQL Server?

  3. MySQL-udløser for at opdatere et felt til værdien af ​​id

  4. Hvordan får man id'et for den sidste indsatte række ved hjælp af forberedt erklæring?