In PostgreSQL gibt es die Schlüsselwörter Limit
und, Offset
die eine sehr einfache Paginierung von Ergebnismengen ermöglichen.
Was ist die äquivalente Syntax für SQL Server?
sql
sql-server
pagination
limit
offset
Earlz
quelle
quelle
Antworten:
Das Äquivalent zu
LIMIT
istSET ROWCOUNT
, aber wenn Sie eine generische Paginierung wünschen, ist es besser, eine Abfrage wie folgt zu schreiben:Der Vorteil hierbei ist die Parametrisierung des Versatzes und des Grenzwerts für den Fall, dass Sie Ihre Paging-Optionen ändern (oder dem Benutzer dies erlauben).
Hinweis: Der
@Offset
Parameter sollte hierfür eine einbasierte Indizierung anstelle der normalen nullbasierten Indizierung verwenden.quelle
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
. MSSQL2008 R2.Table
Datensatz 200.000 Datensätze hat, werden alle zuerst abgerufen und dann das Limit angewendet? Ist diese Abfrage effizient?Diese Funktion ist jetzt in SQL Server 2012 vereinfacht. Dies funktioniert ab SQL Server 2012.
Mit Versatz begrenzen, um 11 bis 20 Zeilen in SQL Server auszuwählen:
OFFSET
: Anzahl der übersprungenen ZeilenNEXT
: erforderliche Anzahl der nächsten ZeilenReferenz: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
quelle
SQL_CALC_FOUND_ROWS
dazu?Ein Hinweis: Diese Lösung funktioniert nur in SQL Server 2005 oder höher, da dies der Zeitpunkt
ROW_NUMBER()
war, an dem sie implementiert wurde.quelle
AS xx
Sie können ROW_NUMBER in einem allgemeinen Tabellenausdruck verwenden, um dies zu erreichen.
quelle
Für mich war die Verwendung von OFFSET und FETCH zusammen langsam, daher habe ich eine Kombination aus TOP und OFFSET wie diese verwendet (die schneller war):
Hinweis: Wenn Sie TOP und OFFSET zusammen in derselben Abfrage verwenden wie:
Dann erhalten Sie eine Fehlermeldung. Um TOP und OFFSET zusammen zu verwenden, müssen Sie sie durch eine Unterabfrage trennen.
Und wenn Sie SELECT DISTINCT verwenden müssen, lautet die Abfrage wie folgt:
Hinweis: Die Verwendung von SELECT ROW_NUMBER mit DISTINCT hat bei mir nicht funktioniert.
quelle
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, müssen Sie es wie transformierenSELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. Ich werde meine Antwort bearbeiten. Danke und entschuldige mein Englisch.Ein weiteres Beispiel:
quelle
Es gibt hier jemanden, der über diese Funktion in SQL 2011 erzählt. Es ist traurig, dass er ein etwas anderes Schlüsselwort "OFFSET / FETCH" gewählt hat, aber es ist nicht Standard, dann ok.
quelle
Ich füge eine geringfügige Variation der Aaronaught-Lösung hinzu und parametrisiere normalerweise die Seitenzahl (@PageNum) und die Seitengröße (@PageSize). Auf diese Weise sendet jedes Seitenklickereignis nur die angeforderte Seitenzahl zusammen mit einer konfigurierbaren Seitengröße:
quelle
Das nächste, was ich machen könnte, ist
Was ich ähnlich denke
select * from [db].[dbo].[table] LIMIT 0, 10
quelle
quelle
quelle
Da noch niemand diesen Code zur Verfügung gestellt hat:
Wichtige Punkte:
@limit
kann durch die Anzahl der abzurufenden Ergebnisse ersetzt werden.@offset
ist die Anzahl der zu überspringenden Ergebnissewhere
undorder by
Klauseln und liefert falsche Ergebnisse, wenn sie nicht synchron sindorder by
gibt es explizit, wenn es das ist, was benötigt wirdquelle
quelle
Speziell für SQL-SERVER können Sie dies auf viele verschiedene Arten erreichen. Als Beispiel haben wir hier die Kundentabelle genommen.
Beispiel 1: Mit "SET ROWCOUNT"
Um alle Zeilen zurückzugeben, setzen Sie ROWCOUNT auf 0
Beispiel 2: Mit "ROW_NUMBER and OVER"
Beispiel 3: Mit "OFFSET and FETCH", aber mit diesem "ORDER BY" ist obligatorisch
Hoffe das hilft dir.
quelle
In SQL Server würden Sie TOP zusammen mit ROW_NUMBER () verwenden.
quelle
Da ich dieses Skript öfter teste, um 1 Million Datensätze auf jeder Seite 100 Datensätze mit Paginierung schneller zu arbeiten, führt mein PC dieses Skript 0 Sekunden lang aus, während der Vergleich mit MySQL ein eigenes Limit hat und etwa 4,5 Sekunden versetzt, um das Ergebnis zu erhalten.
Jemand versteht möglicherweise nicht, dass Row_Number () immer nach bestimmten Feldern sortiert ist. Falls wir nur eine Zeile nacheinander definieren müssen, sollten Sie Folgendes verwenden:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
Erklären:
quelle