Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment ROWNUM fonctionne dans la requête de pagination ?

Vous avez 4 questions, et toutes tournent autour de l'utilisation et des fonctionnalités de ROWNUM . Je répondrai à chaque question une par une.

Pourquoi (c'était ma première tentative jusqu'à ce que je recherche sur SO) Sélectionnez * De la personne où rownum> 100 et rownum <110; renvoie 0 lignes ?

Belle explication de Thomas Kyte concernant ROWNUM et la pagination ici.

Un ROWNUM la valeur est attribuée à une ligne après avoir passé la phase de prédicat de la requête mais avant que la requête n'effectue un tri ou une agrégation. De plus, une valeur ROWNUM n'est incrémentée qu'après son affectation, c'est pourquoi la requête suivante ne renverra jamais de ligne :

select * 
  from t 
 where ROWNUM > 1;

Étant donné que ROWNUM> 1 n'est pas vrai pour la première ligne, ROWNUM n'avance pas jusqu'à 2. Par conséquent, aucune valeur de ROWNUM n'est jamais supérieure à 1.

Pourquoi il n'y a pas de moyen simple de faire quelque chose comme Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound ?

Oui il y a. Depuis Oracle 12c à partir de là, vous pouvez utiliser la nouvelle limitation Top-n Row fonctionnalité. Voir ma réponse ici.

Par exemple, la requête ci-dessous renverrait les employés entre 4ème plus élevé jusqu'au 7e salaire le plus élevé dans l'ordre croissant :

SQL> SELECT empno, sal
  2  FROM   emp
  3  ORDER BY sal
  4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

     EMPNO        SAL
---------- ----------
      7654       1250
      7934       1300
      7844       1500
      7499       1600

SQL>

Comment se débarrasser de la colonne r dans les valeurs résultantes ?

Au lieu de select * , répertoriez les noms de colonne requis dans la requête externe. Pour une utilisation fréquente de la requête, la création d'une vue est une simple activité ponctuelle.

Alternativement, dans SQL*Plus vous pouvez utiliser le NOPRINT commande. Il n'affichera pas le nom de la colonne que vous ne souhaitez pas afficher. Cependant, cela ne fonctionnerait que dans SQL*Plus.

Par exemple,

COLUMN column_name NOPRINT

Par exemple,

SQL> desc dept
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 DEPTNO                                             NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;

    DEPTNO
----------
        10
        20
        30
        40

SQL>

Assure-t-il une pagination correcte ?

Oui, si vous écrivez correctement la requête de pagination.

Par exemple,

SELECT val
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   t
                ORDER BY val)
        WHERE rownum <= 8)
WHERE  rnum >= 5;

       VAL
----------
         3
         3
         4
         4

4 rows selected.

SQL>

Ou, utilisez la nouvelle fonctionnalité de limitation de lignes sur 12c comme je l'ai montré ci-dessus.

Quelques bons exemples ici.