sql >> Databáze >  >> RDS >> Oracle

Použít OFFSET a LIMIT v ORACLE pro složité dotazy na připojení?

Můžete použít analytické funkce, jako je ROW_NUMBER() v rámci dílčího dotazu pro Oracle 11g za předpokladu, že k zachycení OFFSET 3 LIMIT 8 potřebujete získat řádky seřazené mezi 3. a 8. logika v rámci Oracle DB (tyto klauzule jsou skutečně zahrnuty pro verze 12c+ ), kdykoli by měl být výsledek seskupen podle CREATE_DATE a seřazené podle ID oddělení :

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;

což vrátí přesně 6 (8-3+1) řádků. Pokud potřebujete zahrnout vazby (stejné hodnoty pro identity oddělení pro každé datum vytvoření), ROW_NUMBER() by měla být nahrazena jinou funkcí okna s názvem DENSE_RANK() protože všechny ostatní části dotazu zůstávají stejné. Alespoň 6 záznamy by se v tomto případě vrátily.




  1. Laravel 5 UnexpectedValueException v odpovědi na dotaz kvůli použití dat POINT

  2. Dva jednosloupcové indexy vs jeden dvousloupcový index v MySQL?

  3. Seskupit MySQL podle po sobě jdoucích řádků

  4. provést cronjob přesně jednou