"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment limiter et compenser efficacement les résultats de la requête Oracle?

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

Publié le 2025-04-20
Parcourir:983

How to Efficiently Limit and Offset Query Results in Oracle?

Mastering Row Limiting and Offseting dans Oracle Queries

pseudocolumn d'Oracle rownum , fréquemment utilisé pour la limitation du set de résultat, présente un défi unique lorsqu'il est combiné avec l'ordre. Contrairement à la clause de MySQL limit , qui s'applique après tri, Rownum filtres avant La clause d'ordre par est traitée. Cela signifie que l'utilisation de rownum ne garantira pas un sous-ensemble ordonné spécifique de vos résultats.

L'approche standard (toutes les versions oracle):

Pour réaliser l'équivalent de la fonctionnalité limite de MySQL , utilisez une requête imbriquée:

SELECT *
FROM (
    SELECT *
    FROM emp
    ORDER BY sal DESC
)
WHERE ROWNUM 

Cette approche commande d'abord les données, puis applique le filtre rownum , en s'assurant que les 5 meilleurs salaires sont renvoyés.

Offseting et limitant les résultats:

pour un contrôle plus sophistiqué, spécifiant à 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 = :MIN_ROW_TO_FETCH;

remplacer : max_row_to_fetch et : min_row_to_fetch avec vos limites supérieures et inférieures souhaitées. Cela récupère les lignes dans une plage spécifique après la commande.

oracle 12c et au-delà: le fetch clause:

Oracle 12c (et versions ultérieures) offrent 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 plus tard. Pour les versions plus anciennes, l'approche de requête imbriquée reste nécessaire.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3