___ 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.
___