Maison >base de données >tutoriel mysql >ROWNUM dans Oracle : comment obtenir une pagination appropriée et éviter les pièges courants ?
Oracle ROWNUM et Pagination : problèmes courants et solutions
Cet article aborde les défis fréquents rencontrés lors de l'utilisation de ROWNUM
pour la pagination dans Oracle SQL.
Problème 1 : Clause WHERE
inefficace avec ROWNUM
Pourquoi SELECT * FROM Person WHERE rownum > 100
ne renvoie-t-il aucun résultat ?
ROWNUM
est attribué après la phase de filtrage initiale (prédicat). Étant donné qu'une valeur ROWNUM
n'est incrémentée qu'après affectation, une valeur supérieure à 1 ne peut pas être directement sélectionnée à l'aide d'une clause WHERE
de cette manière. Aucune ligne ne satisfait à la condition ROWNUM > 100
.
Problème 2 : ROWNUM BETWEEN
Limitations
Pourquoi WHERE rownum BETWEEN lowerBound AND upperBound
ne convient-il pas à la pagination ?
Cette syntaxe est également inefficace car l'affectation ROWNUM
précède l'évaluation de la clause WHERE
. Oracle ne peut pas sélectionner directement une plage de ROWNUM
valeurs.
Solution : Oracle 12c et au-delà (limitation des n premières lignes)
Oracle 12c a introduit une approche supérieure : "Top-n Row Limiting" utilisant OFFSET
et FETCH
. Par exemple :
<code class="language-sql">SELECT empno, sal FROM emp ORDER BY sal OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;</code>
Cela récupère efficacement les lignes 5 à 8 (décalage 4, récupération 4). Cette méthode est préférée aux techniques reposant uniquement sur ROWNUM
.
Problème 3 : Masquer la colonne ROWNUM
Comment pouvons-nous empêcher la colonne ROWNUM
d'apparaître dans l'ensemble de résultats ?
Répertoriez simplement uniquement les colonnes souhaitées dans l'instruction SELECT
externe. Alternativement, dans SQL*Plus, vous pouvez utiliser la commande NOPRINT
pour supprimer la sortie de colonnes spécifiques.
Problème 4 : Assurer une pagination correcte avec ROWNUM
(anciennes versions d'Oracle)
Est-ce que ROWNUM
peut obtenir une pagination correcte ?
Oui, mais cela nécessite une structure de requête imbriquée :
<code class="language-sql">SELECT val FROM (SELECT val, rownum AS rnum FROM (SELECT val FROM t ORDER BY val) WHERE rownum <= 8) WHERE rnum >= 5;</code>
Cela récupère correctement les lignes 5 à 8. La requête interne attribue ROWNUM
, les filtres de requête du milieu en fonction de la limite supérieure et les filtres de requête externes en fonction de la limite inférieure. Cependant, la méthode OFFSET
/FETCH
reste l'option la plus efficace et la plus lisible dans Oracle 12c et versions ultérieures.
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!