Paging mit Oracle und SQL Server und generische Paging-Methode

7

Ich möchte Paging in einer Gridview oder in einer HTML-Tabelle implementieren, die ich mit Ajax füllen werde. Wie sollte ich Abfragen schreiben, um Paging zu unterstützen? Wenn beispielsweise die Seitengröße 20 ist und der Benutzer auf Seite 3 klickt, müssen Zeilen zwischen 41 und 60 in der Tabelle angezeigt werden. Zuerst kann ich alle Aufzeichnungen bekommen und sie in den Cache stellen, aber ich denke, das ist der falsche Weg. Weil Daten sehr groß sein können und Daten von anderen Sitzungen geändert werden können. Wie kann ich das umsetzen? Gibt es einen generischen Weg (für alle Datenbanken)?

    
user59706 28.01.2009, 15:44
quelle

7 Antworten

17

Wie andere vorgeschlagen haben, können Sie in Oracle rownum verwenden. Es ist ein wenig schwierig, und Sie müssen Ihre Abfrage zweimal verschachteln.

Beispielsweise um die Abfrage zu paginieren

%Vor%

Sie müssen es so verschachteln

%Vor%

Der Grund dafür ist, dass rownum nach der where-Klausel und vor der order by-Klausel bestimmt wird. Um zu sehen, was ich meine, können Sie

abfragen %Vor%

und Sie könnten

erhalten %Vor%

Das liegt daran, dass oracle die where-Klausel (in diesem Fall keine) auswertet, dann rownums zuweist und die Ergebnisse nach first_name sortiert. Sie müssen die Abfrage so verschachteln, dass sie das zugewiesene verwendet, nachdem die Zeilen sortiert wurden.

Die zweite Verschachtelung hat damit zu tun, wie rownum in einem Zustand behandelt wird. Grundsätzlich, wenn Sie abfragen "wo rownum & gt; 100", dann erhalten Sie keine Ergebnisse. Es ist ein Huhn und Ei-Ding, wo es keine Reihen zurückgeben kann, bis es rownum findet & gt; 100, aber da es keine Zeilen zurückgibt, erhöht es nie rownum, also zählt es nie zu 100. Ugh. Die zweite Verschachtelungsstufe löst dies. Beachten Sie, dass es an dieser Stelle die rownum-Spalte aliasieren muss.

Schließlich muss Ihre order by-Klausel die Abfrage deterministisch machen. Wenn Sie beispielsweise John Doe und John Smith haben und nur nach dem Vornamen sortieren, können die beiden Orte von einer Ausführung der Abfrage zur nächsten wechseln.

Es gibt hier Artikel Ссылка und hier Ссылка . Jetzt, wo ich sehe, wie lange mein Beitrag ist, hätte ich wahrscheinlich gerade diese Links gepostet ...

    
06.02.2009 01:27
quelle
4

Leider variieren die Methoden zum Einschränken des Zeilenumfangs, der von einer Abfrage zurückgegeben wird, von einem DBMS zu einem anderen: Oracle verwendet ROWNUM (siehe Antwort von ocdecio), aber ROWNUM funktioniert nicht in SQL Server.

Vielleicht können Sie diese Unterschiede mit einer Funktion kapseln, die eine gegebene SQL-Anweisung und die erste und letzte Zeilennummer übernimmt und die entsprechende paginatd-SQL für das Ziel-DBMS erzeugt - also etwa wie folgt:

%Vor%

was zurückgeben würde

%Vor%

für Oracle und etwas anderes für SQL Server.

Beachten Sie jedoch, dass die Oracle-Lösung eine neue Spalte RN zu den Ergebnissen hinzufügt, mit denen Sie sich befassen müssen.

    
Tony Andrews 28.01.2009 16:25
quelle
1

Ich glaube, dass beide eine ROWNUM analytische Funktion haben. Benutze das und du wirst identisch sein.

In Oracle ist hier

ROW_NUMMER

Ja, habe gerade verifiziert, dass ROW_NUMBER in beiden die gleiche Funktion ist.

    
Mark Brady 28.01.2009 17:47
quelle
1

"Da Daten von anderen Sitzungen geändert werden können." Was willst du dafür tun?

Beispielsweise erhält der Benutzer die "neuesten" zehn Zeilen um 10:30 Uhr.

Um 10:31 werden 3 neue Zeilen hinzugefügt (also sind die zehn vom Benutzer angezeigten nicht mehr die neuesten).

Um 10:32 Uhr fordert der Benutzer dann die nächsten zehn Einträge an.

Willst du, dass der neue Satz jene drei beinhaltet, die vom 8.9.10 bis zum 11.12.13 gestoßen wurden? Wenn nicht, können Sie in Oracle die Daten so auswählen, wie sie um 10:30 Uhr waren

%Vor%

Sie benötigen weiterhin die row_number-Logik, zB

%Vor%     
Gary Myers 28.01.2009 23:50
quelle
1
%Vor%

Schritt 1: Ihre Anfrage mit der Bestellung von

Schritt 2: select a.*, ROWNUM rnum from ()a where ROWNUM <=:MAX_ROW_TO_FETCH

Schritt 3: select * from ( ) where rnum >= :MIN_ROW_TO_FETCH; Setze 1 in 2 und 2 in 3 ein

    
Ashis 23.11.2010 16:57
quelle
0

Wenn der erwartete Datensatz sehr groß ist, würde ich empfehlen, eine temporäre Tabelle, eine Ansicht oder einen Snapshot (materialisierte Ansicht) zu erstellen, um die Abfrageergebnisse + eine Zeilennummer entweder mithilfe der ROWNUM- oder ROW_NUMBER-Analysefunktion zu speichern. Danach können Sie diesen temporären Speicher einfach über Zeilennummernbereiche abfragen. Grundsätzlich müssen Sie den tatsächlichen Datenabruf vom Paging trennen.

    
user34850 28.01.2009 21:02
quelle
0
___ qstnhdr ___ Paging mit Oracle und SQL Server und generische Paging-Methode ___ answer518769 ___

Wie andere vorgeschlagen haben, können Sie in Oracle rownum verwenden. Es ist ein wenig schwierig, und Sie müssen Ihre Abfrage zweimal verschachteln.

Beispielsweise um die Abfrage zu paginieren

%Vor%

Sie müssen es so verschachteln

%Vor%

Der Grund dafür ist, dass rownum nach der where-Klausel und vor der order by-Klausel bestimmt wird. Um zu sehen, was ich meine, können Sie

abfragen %Vor%

und Sie könnten

erhalten %Vor%

Das liegt daran, dass oracle die where-Klausel (in diesem Fall keine) auswertet, dann rownums zuweist und die Ergebnisse nach first_name sortiert. Sie müssen die Abfrage so verschachteln, dass sie das zugewiesene verwendet, nachdem die Zeilen sortiert wurden.

Die zweite Verschachtelung hat damit zu tun, wie rownum in einem Zustand behandelt wird. Grundsätzlich, wenn Sie abfragen "wo rownum & gt; 100", dann erhalten Sie keine Ergebnisse. Es ist ein Huhn und Ei-Ding, wo es keine Reihen zurückgeben kann, bis es rownum findet & gt; 100, aber da es keine Zeilen zurückgibt, erhöht es nie rownum, also zählt es nie zu 100. Ugh. Die zweite Verschachtelungsstufe löst dies. Beachten Sie, dass es an dieser Stelle die rownum-Spalte aliasieren muss.

Schließlich muss Ihre order by-Klausel die Abfrage deterministisch machen. Wenn Sie beispielsweise John Doe und John Smith haben und nur nach dem Vornamen sortieren, können die beiden Orte von einer Ausführung der Abfrage zur nächsten wechseln.

Es gibt hier Artikel Ссылка und hier Ссылка . Jetzt, wo ich sehe, wie lange mein Beitrag ist, hätte ich wahrscheinlich gerade diese Links gepostet ...

    
___ qstntxt ___

Ich möchte Paging in einer Gridview oder in einer HTML-Tabelle implementieren, die ich mit Ajax füllen werde. Wie sollte ich Abfragen schreiben, um Paging zu unterstützen? Wenn beispielsweise die Seitengröße 20 ist und der Benutzer auf Seite 3 klickt, müssen Zeilen zwischen 41 und 60 in der Tabelle angezeigt werden. Zuerst kann ich alle Aufzeichnungen bekommen und sie in den Cache stellen, aber ich denke, das ist der falsche Weg. Weil Daten sehr groß sein können und Daten von anderen Sitzungen geändert werden können. Wie kann ich das umsetzen? Gibt es einen generischen Weg (für alle Datenbanken)?

    
___ answer4258640 ___
%Vor%

Schritt 1: Ihre Anfrage mit der Bestellung von

Schritt 2: %code%

Schritt 3: %code% Setze 1 in 2 und 2 in 3 ein

    
___ answer489941 ___

"Da Daten von anderen Sitzungen geändert werden können." Was willst du dafür tun?

Beispielsweise erhält der Benutzer die "neuesten" zehn Zeilen um 10:30 Uhr.

Um 10:31 werden 3 neue Zeilen hinzugefügt (also sind die zehn vom Benutzer angezeigten nicht mehr die neuesten).

Um 10:32 Uhr fordert der Benutzer dann die nächsten zehn Einträge an.

Willst du, dass der neue Satz jene drei beinhaltet, die vom 8.9.10 bis zum 11.12.13 gestoßen wurden? Wenn nicht, können Sie in Oracle die Daten so auswählen, wie sie um 10:30 Uhr waren

%Vor%

Sie benötigen weiterhin die row_number-Logik, zB

%Vor%     
___ antwort500370 ___

Es gibt keine einheitliche Methode, um das Paging zwischen verschiedenen RDBMS-Produkten sicherzustellen. Oracle gibt Ihnen rownum, das Sie in Where-Klausel wie verwenden können:

%Vor%

SQL Server gibt Ihnen die Funktion row_id (), die ähnlich wie Oracle rown verwendet werden kann. Row_id () ist jedoch nicht vor SQL Server 2005 verfügbar.

    
___ tag123sqlserver ___ Microsoft SQL Server ist ein relationales Datenbankverwaltungssystem (RDBMS). Verwenden Sie dieses Tag für alle SQL Server-Editionen, einschließlich Compact, Express, Azure, Fast-Track, APS (früher PDW) und Azure SQL DW. Verwenden Sie dieses Tag nicht für andere Arten von DBMS (MySQL, PostgreSQL, Oracle usw.). Verwenden Sie dieses Tag nicht für Probleme bei der Software- und mobilen Entwicklung, es sei denn, es steht in direktem Zusammenhang mit der Datenbank. ___ tag123oracle ___ Oracle Database ist ein Datenbankmanagementsystem mit mehreren Modellen, das von Oracle Corporation erstellt wurde. Verwenden Sie dieses Tag NICHT für andere Produkte von Oracle wie Java und MySQL. ___ answer489345 ___

Wenn der erwartete Datensatz sehr groß ist, würde ich empfehlen, eine temporäre Tabelle, eine Ansicht oder einen Snapshot (materialisierte Ansicht) zu erstellen, um die Abfrageergebnisse + eine Zeilennummer entweder mithilfe der ROWNUM- oder ROW_NUMBER-Analysefunktion zu speichern. Danach können Sie diesen temporären Speicher einfach über Zeilennummernbereiche abfragen. Grundsätzlich müssen Sie den tatsächlichen Datenabruf vom Paging trennen.

    
___ answer488623 ___

Ich glaube, dass beide eine ROWNUM analytische Funktion haben. Benutze das und du wirst identisch sein.

In Oracle ist hier

ROW_NUMMER

Ja, habe gerade verifiziert, dass ROW_NUMBER in beiden die gleiche Funktion ist.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer488297 ___

Leider variieren die Methoden zum Einschränken des Zeilenumfangs, der von einer Abfrage zurückgegeben wird, von einem DBMS zu einem anderen: Oracle verwendet ROWNUM (siehe Antwort von ocdecio), aber ROWNUM funktioniert nicht in SQL Server.

Vielleicht können Sie diese Unterschiede mit einer Funktion kapseln, die eine gegebene SQL-Anweisung und die erste und letzte Zeilennummer übernimmt und die entsprechende paginatd-SQL für das Ziel-DBMS erzeugt - also etwa wie folgt:

%Vor%

was zurückgeben würde

%Vor%

für Oracle und etwas anderes für SQL Server.

Beachten Sie jedoch, dass die Oracle-Lösung eine neue Spalte RN zu den Ergebnissen hinzufügt, mit denen Sie sich befassen müssen.

    
___
Tanveer Badar 01.02.2009 07:11
quelle

Tags und Links