Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Aplicar OFFSET e LIMIT no ORACLE para consultas complexas de junção?


Você pode usar funções analíticas como ROW_NUMBER() dentro de uma subconsulta para Oracle 11g supondo que você precise obter as linhas classificadas entre 3º e 8º para capturar o OFFSET 3 LIMIT 8 lógica dentro do banco de dados Oracle (na verdade, essas cláusulas estão incluídas para as versões 12c+ ), sempre que o resultado deva ser agrupado por CREATE_DATE e ordenados pelo ID dos departamentos:
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;

que retorna exatamente 6 (8-3+1) linhas. Se você precisar incluir os laços (os valores iguais para identidades de departamento para cada data de criação), ROW_NUMBER() deve ser substituído por outra função de janela chamada DENSE_RANK() pois todas as outras partes da consulta permanecem as mesmas. Pelo menos 6 registros retornariam neste caso.