Vous pouvez utiliser des fonctions analytiques telles que ROW_NUMBER()
dans une sous-requête pour Oracle 11g
en supposant que vous devez obtenir les lignes classées entre la 3ème et la 8ème afin de capturer le OFFSET 3 LIMIT 8
logique dans la base de données Oracle (en effet, ces clauses sont incluses pour les versions 12c+
), chaque fois que le résultat doit être regroupé par CREATE_DATE
et classé par ID
des départements :
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;
qui renvoie exactement 6 (8-3+1) rangées. Si vous devez inclure les liens (les valeurs égales pour les identités de service pour chaque date de création), ROW_NUMBER()
doit être remplacé par une autre fonction de fenêtre appelée DENSE_RANK()
car toutes les autres parties de la requête restent les mêmes. Au moins 6 les enregistrements reviendraient dans ce cas.