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

Top-N-Abfragen und Paginierung in Oracle

Top-N-Abfragen und Paginierung sind in webbasierten Anwendungen üblich. Der Benutzer gibt eine Reihe von Kriterien ein, die eine Abfrage ausführen und dann den Benutzer auf die Schaltflächen Zurück und Weiter klicken lassen, um durch die Ergebnismenge zu blättern. Um diese Paging-Funktion zu erreichen, muss die Anwendung in der Lage sein, einen bestimmten Satz von Zeilen aus der Datenbankabfrage abzurufen.

Werfen wir einen Blick auf die verschiedenen Methoden in Oracle, um Top-N-Abfragen in Oracle und Paginierung in Oracle-Abfragen zu erreichen

Vor 12c

(1) Verwendung der ROWNUM-Klausel

Was ist ROWNUM
Es ist eine Pseudospalte (keine echte Spalte), die in einer Abfrage verfügbar ist. ROWNUM werden die Nummern 1, 2, 3, 4, … N zugewiesen, wobei N die Anzahl der Zeilen in der Menge ist, mit der ROWNUM verwendet wird. Ein ROWNUM-Wert wird einer Zeile nicht dauerhaft zugewiesen .

So erhalten Sie die Top-5-Werte

SELECT *
FROM (SELECT *
FROM dept
ORDER BY sales DESC)
WHERE ROWNUM <= 5;

Diese Version sortiert Dept nach absteigendem Umsatz und gibt dann die ersten fünf Datensätze zurück, auf die sie stößt (die ersten fünf Datensätze).
Für die Paginierung in Oracle , wenn Sie die 5-10 Datensätze der Dept nach Umsatz absteigend ordnen möchten Mach das.

SELECT a.*
FROM (SELECT ROWNUM rn, b.*
FROM ( SELECT *
FROM dept
ORDER BY sales dsc) b  where rn <=10) a
WHERE a.rn >= 5

Die allgemeine Syntax wäre

select *
from
( select rownum rnum, a.*
from (your_query) a
where rownum <= M )
where rnum >= N;

(2) Verwendung der Oracle-Analysefunktion ROW_NUMBER():Sie verhält sich ähnlich wie die ROWNUM-Pseudospalte, ist aber flexibler und hat mehr Möglichkeiten

So erhalten Sie die Top-5-Werte

SELECT *
FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Hier ist die Abfrage für Paginierung

SELECT * FROM (
SELECT
d.*,
row_number() over (ORDER BY d.sales DSC) rn
FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;

Die obigen Top-N-Abfragen geben unterschiedliche Datensätze zurück, wenn zwei Dinge für die Stelle gleich sind, wenn die Top-N-Abfragen verwendet werden


(3) Verwendung von RANK() und DENSE_RANK():Dies sind analytische Funktionen, die verwendet werden können, um das oben genannte Problem zu beseitigen.
Hier ist der Weg, um die Top-5-Werte mithilfe von Rang zu erhalten

SELECT *
FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

So erhalten Sie die Top-5-Werte mit dense_rank

SELECT *
FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn
FROM dept d
)
WHERE rn <= 5;

Mit 12c

Top-N-Funktion :

Oracle Database 12c enthält Unterstützung für die Klauseln FETCH FIRST/NEXT und OFFSET des ANSI-Standards, die zusammen als Zeilenbegrenzungsklausel bezeichnet werden. Mit dieser Klausel können Sie ganz einfach die ersten N Datensätze aus einer Ergebnismenge abrufen oder alternativ die ersten N Datensätze nach dem Überspringen einer Reihe von Datensätzen, sodass Sie problemlos durch eine Ergebnismenge blättern können

Eine Top-N-Abfrage ermöglicht es uns, die obersten oder untersten N-Zeilen aus einer geordneten Menge abzurufen. Das Kombinieren von zwei Top-N-Abfragen gibt Ihnen die Möglichkeit, durch eine geordnete Menge zu blättern

Beispiel:

SELECT value
FROM mytable
ORDER BY value DESC
FETCH FIRST 10 ROWS ONLY;  

select * from my_test order by name fetch first 3 rows only;

Wenn Sie sich den Optimierungsplan für die obige Abfrage ansehen, verwendet er immer noch row_number() unter dem Wrap, um dies zu tun

Die Paginierung kann auch mit dieser Funktion mit der Use-Offset-Syntax erfolgen

– Offset 10 Zeilen nur die ersten 10 Zeilen abrufen

select * from my_test order by id
offset 10 rows fetch next 10 rows only;

– Versatz um 10 Zeilen holt nur die ersten 0,1 Prozentzeilen

select * from my_test order by id offset 10 rows first 0.1 percent rows only;

– Versetzen Sie 10 Zeilen und holen Sie die ersten 3 Zeilen mit Bindungen. Das bedeutet, dass alle obersten Zeilen mit Bindungen auch in das Ergebnis aufgenommen werden

select * from my_test order by name fetch first 3 rows with ties;

Wenn Sie den Optimiererplan der obigen Abfrage überprüfen, werden Sie feststellen, dass der Optimierer die Funktion rank() verwendet, wie oben im Fall vor 12c gezeigt

Einschränkung
(1)Wenn Sie eine SELECT-Anweisung mit FOR UPDATE haben, können Sie sie nicht verwenden.
(2)Die SELECT-Anweisung kann CURRVAL oder NEXTVAL von Sequenzen nicht ausführen
(3) If die Abfrage der materialisierten Ansichten diese Klausel hat, dann können Sie diese materialisierte Ansicht nicht inkrementell aktualisieren

Ich hoffe, Ihnen gefällt der Artikel über Top-N-Abfragen in Oracle und Paginierung in Oracle-Abfragen. Bitte geben Sie Feedback

Liest auch
Lead-Funktion in Oracle
RANK-Funktion in Oracle
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html