Maison > base de données > tutoriel mysql > Comment limiter et compenser efficacement les résultats de la requête dans Oracle?

Comment limiter et compenser efficacement les résultats de la requête dans Oracle?

Mary-Kate Olsen
Libérer: 2025-01-25 08:52:11
original
909 Les gens l'ont consulté

How to Efficiently Limit and Offset Query Results in Oracle?

Maîtriser la limitation et la compensation des lignes dans les requêtes Oracle

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;
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal