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.