Maison >base de données >tutoriel mysql >Comment limiter les résultats des requêtes Oracle après la commande ?

Comment limiter les résultats des requêtes Oracle après la commande ?

DDD
DDDoriginal
2025-01-25 08:32:09325parcourir

How to Limit Oracle Query Results After Ordering?

Limiter de manière concise les résultats ordonnés dans Oracle

La limitation des lignes d'Oracle diffère des dialectes SQL plus simples comme MySQL. Alors que MySQL utilise LIMIT, Oracle utilise la pseudo-colonne ROWNUM. Cependant, utiliser directement ROWNUM dans une clause WHERE avant ORDER BY donne des résultats imprévisibles.

Le défi : commander avant de limiter

Le problème vient de l'évaluation de ROWNUM avant la clause ORDER BY. Cela signifie que vous n'obtenez pas les N premières lignes après le tri ; à la place, vous obtenez N lignes arbitraires.

La solution : des sous-requêtes pour un contrôle précis

Pour limiter correctement les lignes après le tri, utilisez une sous-requête :

<code class="language-sql">SELECT *
FROM (
  SELECT *
  FROM emp
  ORDER BY sal DESC
)
WHERE ROWNUM <= 10;</code>

Cela classe d'abord la table emp par salaire (sal) décroissant, puis la requête externe sélectionne uniquement les 10 premières lignes en utilisant ROWNUM.

Spécification des lignes de début et de fin :

Pour un contrôle plus précis, la définition des limites supérieure et inférieure nécessite des sous-requêtes imbriquées :

<code class="language-sql">SELECT *
FROM (
  SELECT a.*, ROWNUM rnum
  FROM (
    SELECT * FROM emp ORDER BY sal DESC
  ) a
  WHERE ROWNUM <= 30
)
WHERE rnum >= 21;</code>

Ceci récupère les lignes 21 à 30 (inclus) après tri par salaire.

Oracle moderne (12c et versions ultérieures) : syntaxe simplifiée

Oracle 12c et versions ultérieures offrent une approche plus propre :

<code class="language-sql">-- Top 10 results
SELECT *
FROM sometable
ORDER BY name
FETCH FIRST 10 ROWS ONLY;

-- Rows 20-30
SELECT *
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>

Cette syntaxe FETCH FIRST et OFFSET est nettement plus lisible et efficace pour la pagination. Utilisez cette méthode si votre version d'Oracle la prend en charge.

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:
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