sql >> Databasteknik >  >> RDS >> Oracle

Tillämpa OFFSET och LIMIT i ORACLE för komplexa anslutningsfrågor?

Du kan använda analytiska funktioner som ROW_NUMBER() i en underfråga för Oracle 11g förutsatt att du behöver få raderna rankade mellan 3:e och 8:e för att fånga OFFSET 3 LIMIT 8 logik i Oracle DB(dessa klausuler ingår faktiskt för versioner 12c+ ), närhelst resultatet ska grupperas efter CREATE_DATE och sorteras efter ID av avdelningarna :

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 returnerar exakt 6 (8-3+1) rader. Om du behöver inkludera kopplingarna (de lika värdena för avdelningsidentiteter för varje skapandedatum), ROW_NUMBER() bör ersättas med en annan fönsterfunktion som heter DENSE_RANK() eftersom alla andra delar av frågan förblir desamma. Minst 6 poster skulle återkomma i det här fallet.




  1. Infoga ett specifikt id i automatiskt inkrementerat fält i MySQL med Entity Framework 5

  2. UPPDATERA/RADERA i mysql och få listan över berörda rad-ID?

  3. Vilka branscher drar mest nytta av Access?

  4. MySQL-gränsintervall