Sie haben 4 Fragen, die sich alle um die Verwendung und Funktionalität von ROWNUM drehen . Ich werde jede Frage einzeln beantworten.
Warum (das war mein erster Versuch, bis ich nach SO suchte) Select * From Person Where rownum> 100 and rownum <110; gibt 0 Zeilen zurück ?
Schöne Erklärung von Thomas Kyte bezüglich ROWNUM und Paginierung hier.
Eine ZEILENNUMMER Der Wert wird einer Zeile zugewiesen, nachdem sie die Prädikatphase durchlaufen hat der Abfrage, aber bevor die Abfrage sortiert oder aggregiert. Außerdem wird ein ROWNUM-Wert erst erhöht, nachdem er zugewiesen wurde, weshalb die folgende Abfrage niemals eine Zeile zurückgibt:
select *
from t
where ROWNUM > 1;
Da ROWNUM> 1 für die erste Zeile nicht wahr ist, wird ROWNUM nicht auf 2 erhöht. Daher darf kein ROWNUM-Wert jemals größer als 1 sein.
Warum gibt es keine einfache Möglichkeit, so etwas wie Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound zu tun?
Ja da ist. Von Oracle 12c ab, könnten Sie die neue Obere-n-Reihen-Begrenzung verwenden Merkmal. Siehe meine Antwort hier.
Die folgende Abfrage würde beispielsweise die Mitarbeiter zwischen 4. höchsten zurückgeben bis zum siebthöchsten Gehalt in aufsteigender Reihenfolge:
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>
Wie wird die r-Spalte in den resultierenden Werten entfernt?
Statt select *
, listen Sie die erforderlichen Spaltennamen in der äußeren Abfrage auf. Für die häufige Verwendung der Abfrage ist das Erstellen einer Ansicht eine einfache einmalige Aktivität.
Alternativ in SQL*Plus
Sie könnten das NOPRINT verwenden Befehl. Der Spaltenname, den Sie nicht anzeigen möchten, wird nicht angezeigt. Allerdings würde es nur in SQL*Plus funktionieren.
Zum Beispiel
COLUMN column_name NOPRINT
Zum Beispiel
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>
Gewährleistet es eine korrekte Paginierung?
Ja, wenn Sie die Paginierungsabfrage richtig schreiben.
Zum Beispiel
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>
Oder verwenden Sie die neue Zeilenbegrenzungsfunktion auf 12c, wie ich oben gezeigt habe.
Einige gute Beispiele hier.