Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zastosuj OFFSET i LIMIT w ORACLE dla złożonych zapytań Join?

Możesz używać funkcji analitycznych, takich jak ROW_NUMBER() w podzapytaniu dla Oracle 11g zakładając, że musisz uzyskać wiersze w rankingu od 3 do 8, aby przechwycić OFFSET 3 LIMIT 8 logika wewnątrz bazy danych Oracle (w rzeczywistości te klauzule są zawarte dla wersji 12c+ ), gdy wynik powinien być pogrupowany według CREATE_DATE i uporządkowane według ID działów :

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 zwraca dokładnie 6 (8-3+1) rzędów. Jeśli musisz uwzględnić powiązania (równe wartości dla tożsamości działów dla każdej daty utworzenia), ROW_NUMBER() należy zastąpić inną funkcją okna o nazwie DENSE_RANK() ponieważ wszystkie pozostałe części zapytania pozostają takie same. Co najmniej 6 w takim przypadku zostaną zwrócone rekordy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyjście ODP.NET Parametr String nie zwraca wartości

  2. Dynamiczny kursor Oracle

  3. Jak warunkowo wybrać kolumnę w zapytaniu Oracle

  4. Wiele partycji na stole?

  5. Oracle automatycznie wstawia rekord w bloku multirecord część 2