La pseudo-colonne ROWNUM
d'Oracle, fréquemment utilisée pour limiter les ensembles de résultats, présente un défi unique lorsqu'elle est combinée avec le classement. Contrairement à la clause LIMIT
de MySQL, qui s'applique après le tri, ROWNUM
filtre avant que la clause ORDER BY
soit traitée. Cela signifie que le simple fait d'utiliser ROWNUM
ne garantira pas un sous-ensemble ordonné spécifique de vos résultats.
L'approche standard (toutes les versions d'Oracle) :
Pour obtenir l'équivalent de la fonctionnalité LIMIT
de MySQL, utilisez une requête imbriquée :
SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 5;
Cette approche classe d'abord les données, puis applique le filtre ROWNUM
, garantissant que les 5 salaires les plus élevés soient renvoyés.
Résultats de compensation et de limitation :
Pour un contrôle plus sophistiqué, spécifier à la fois un décalage et une limite nécessite une requête légèrement plus complexe :
SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * -- Your main query with ORDER BY clause FROM some_table ORDER BY some_column ) a WHERE ROWNUM <= :MAX_ROW_TO_FETCH ) WHERE rnum >= :MIN_ROW_TO_FETCH;
Remplacez :MAX_ROW_TO_FETCH
et :MIN_ROW_TO_FETCH
par les limites supérieure et inférieure souhaitées. Cela récupère les lignes dans une plage spécifique après la commande.
Oracle 12c et au-delà : la clause FETCH
:
Oracle 12c (et versions ultérieures) propose une solution plus élégante en utilisant la clause FETCH
:
-- Retrieve the first 10 rows SELECT * FROM sometable ORDER BY name FETCH FIRST 10 ROWS ONLY; -- Retrieve rows 20-30 SELECT * FROM sometable ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
La clause FETCH
fournit un moyen plus propre et plus lisible de limiter et de compenser les résultats, ce qui en fait la méthode préférée pour Oracle 12c et versions ultérieures. Pour les anciennes versions, l'approche des requêtes imbriquées reste nécessaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!