Je hebt 4 vragen en ze draaien allemaal om het gebruik en de functionaliteit van ROWNUM . Ik zal elke vraag één voor één beantwoorden.
Waarom (dit was mijn eerste poging totdat ik op SO zoek) Selecteer * Van Persoon Waar rownum> 100 en rownum <110; geeft 0 rijen terug ?
Mooie uitleg door Thomas Kyte over ROWNUM en paginering hier.
EEN ROWNUM waarde wordt toegewezen aan een rij nadat deze de predikaatfase heeft gepasseerd van de query, maar voordat de query wordt gesorteerd of geaggregeerd. Bovendien wordt een ROWNUM-waarde pas verhoogd nadat deze is toegewezen, daarom zal de volgende query nooit een rij retourneren:
select *
from t
where ROWNUM > 1;
Omdat ROWNUM> 1 niet waar is voor de eerste rij, gaat ROWNUM niet verder naar 2. Daarom wordt de ROWNUM-waarde nooit groter dan 1.
Waarom is er geen eenvoudige manier om zoiets te doen als Selecteer ... VAN ... WAAR rijnummer TUSSEN ondergrens EN bovengrens?
Ja dat is er. Van Oracle 12c vanaf dan kunt u de nieuwe Top-n Row-beperking . gebruiken functie. Zie hier mijn antwoord.
De onderstaande zoekopdracht zou bijvoorbeeld de werknemers tussen 4e hoogste . opleveren tot 7e hoogste salarissen in oplopende volgorde:
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>
Hoe de r-kolom in de resulterende waarden te verwijderen?
In plaats van select *
, vermeld de vereiste kolomnamen in de buitenste query. Als u de query vaak gebruikt, is het maken van een weergave een eenvoudige eenmalige activiteit.
Als alternatief, in SQL*Plus
je zou de NOPRINT . kunnen gebruiken opdracht. De kolomnaam die u niet wilt weergeven, wordt niet weergegeven. Het zou echter alleen werken in SQL*Plus.
Bijvoorbeeld,
COLUMN column_name NOPRINT
Bijvoorbeeld,
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>
Zorgt het voor een correcte paginering?
Ja, als u de paginatiequery correct schrijft.
Bijvoorbeeld,
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>
Of gebruik de nieuwe rijbeperkende functie op 12c, zoals ik hierboven heb laten zien.
Enkele goede voorbeelden hier.