Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie funktioniert ROWNUM bei der Paginierungsabfrage?

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.