sql >> Database >  >> RDS >> Oracle

OFFSET en LIMIT toepassen in ORACLE voor complexe join-query's?

U kunt analytische functies gebruiken, zoals ROW_NUMBER() binnen een subquery voor Oracle 11g ervan uitgaande dat u de rijen tussen de 3e en 8e moet krijgen om de OFFSET 3 LIMIT 8 vast te leggen logica binnen de Oracle DB(die clausules zijn inderdaad opgenomen voor versies 12c+ ), wanneer het resultaat moet worden gegroepeerd op CREATE_DATE en besteld door de ID van de afdelingen :

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;

wat precies 6 returns oplevert (8-3+1) rijen. Als u de banden moet opnemen (de gelijke waarden voor afdelingsidentiteiten voor elke aanmaakdatum), ROW_NUMBER() moet worden vervangen door een andere vensterfunctie genaamd DENSE_RANK() aangezien alle andere delen van de query hetzelfde blijven. Minstens 6 records zouden in dit geval terugkeren.




  1. TIMESTAMP van MySQL gebruiken versus tijdstempels rechtstreeks opslaan

  2. Hoe soundex() opvragen in mysql

  3. Hoe NULL als parameter te beperken tot SQL Server opgeslagen procedure?

  4. Hoe een equivalent van ResultSetMetaData te krijgen zonder ResultSet