Gibt es in SQL Server eine Möglichkeit, die Ergebnisse ab einem bestimmten Offset zu erhalten? In einer anderen Art von SQL-Datenbank ist beispielsweise Folgendes möglich:
SELECT * FROM MyTable OFFSET 50 LIMIT 25
um Ergebnisse zu erhalten 51-75. Dieses Konstrukt scheint in SQL Server nicht vorhanden zu sein.
Wie kann ich dies erreichen, ohne alle Zeilen zu laden, die mir egal sind? Vielen Dank!
sql
sql-server
Alex
quelle
quelle
Antworten:
Ich würde es vermeiden, es zu benutzen
SELECT *
. Geben Sie die gewünschten Spalten an, auch wenn es sich möglicherweise um alle handelt.SQL Server 2005+
SQL Server 2000
Effizientes Blättern durch große Ergebnismengen in SQL Server 2000
Eine effizientere Methode zum Blättern durch große Ergebnismengen
quelle
SELECT *
bedeutet , dass , wenn die Struktur der Tabelle ändert, Ihre Anfrage noch läuft, aber unterschiedliche Ergebnisse. Wenn eine Spalte hinzugefügt wird, kann dies nützlich sein (obwohl Sie sie noch irgendwo namentlich verwenden müssen). Wenn eine Spalte gelöscht oder umbenannt wird, ist es besser, wenn Ihre SQL sichtbar unterbrochen wird, als wenn sich der Code weiter unten merkwürdig verhält, da eine Variable nicht initialisiert ist.Wenn Sie alle Seiten der Reihe nach verarbeiten,
TOP (25) ... WHERE Key > @last_key ORDER BY Key
kann es die beste Methode sein, sich den letzten Schlüsselwert auf der vorherigen Seite zu merken und zu verwenden , wenn geeignete Indizes vorhanden sind, damit dies effizient gesucht werden kann - oder einen API-Cursor, wenn dies nicht der Fall ist .Für die Auswahl einer beliebigen Seite ist wahrscheinlich
ROW_NUMBER
und die beste Lösung für SQL Server 2005 - 2008 R2BETWEEN
Für SQL Server 2012+ können Sie die erweiterte ORDER BY- Klausel für diesen Bedarf verwenden.
Obwohl es bleibt auch abzuwarten , wie die Durchführung wird diese Option sein .
quelle
Dies ist eine Möglichkeit (SQL2000)
und dies ist ein anderer Weg (SQL 2005)
quelle
Sie können die
ROW_NUMBER()
Funktion verwenden, um das zu erhalten, was Sie möchten:quelle
Es gibt
OFFSET .. FETCH
in SQL Server 2012, aber Sie müssen eineORDER BY
Spalte angeben .Wenn Sie wirklich keine explizite Spalte haben, die Sie als
ORDER BY
Spalte übergeben könnten (wie andere vorgeschlagen haben), können Sie diesen Trick verwenden:... oder
Wir verwenden es in jOOQ, wenn Benutzer keine Reihenfolge explizit angeben. Dies führt dann zu einer ziemlich zufälligen Bestellung ohne zusätzliche Kosten.
quelle
Für Tabellen mit mehr und großen Datenspalten bevorzuge ich:
- -
Bei Tabellen mit großen Datenmengen wie BLOBs ist die Leistung viel besser, da die Funktion ROW_NUMBER nur eine Spalte durchsuchen muss und nur die übereinstimmenden Zeilen mit allen Spalten zurückgegeben werden.
quelle
Siehe meine Auswahl für Paginator
Dies löst die Paginierung;)
quelle
quelle
Abhängig von Ihrer Version können Sie dies nicht direkt tun, aber Sie könnten etwas Hackiges tun
Dabei ist 'Feld' der Schlüssel.
quelle
Im Folgenden werden 25 Datensätze mit Ausnahme der ersten 50 Datensätze angezeigt, die in SQL Server 2012 ausgeführt werden.
Sie können die ID als Ihre Anforderung ersetzen
quelle
Sie sollten vorsichtig sein, wenn Sie die
ROW_NUMBER() OVER (ORDER BY)
Anweisung verwenden, da die Leistung ziemlich schlecht ist. Gleiches gilt für die Verwendung von Common Table ExpressionsROW_NUMBER()
, was noch schlimmer ist. Ich verwende das folgende Snippet, das sich als etwas schneller erwiesen hat als die Verwendung einer Tabellenvariablen mit einer Identität zur Angabe der Seitenzahl.quelle
Ich benutze diese Technik zur Paginierung. Ich hole nicht alle Zeilen. Wenn auf meiner Seite beispielsweise die obersten 100 Zeilen angezeigt werden müssen, rufe ich nur die 100 mit der where-Klausel ab. Die Ausgabe von SQL sollte einen eindeutigen Schlüssel haben.
Die Tabelle enthält Folgendes:
Der gleiche Rang wird für mehr als eine KeyId vergeben.
SQL ist
select top 2 * from Table1 where Rank >= @Rank and ID > @Id
Zum ersten Mal übergebe ich 0 für beide. Der zweite Durchgang 1 & 14. 3. Durchgang 2 und 6 ....
Der Wert des 10. Datensatzes Rank & Id wird an den nächsten übergeben
Dies wird das System am wenigsten belasten
quelle
In SqlServer2005 können Sie Folgendes tun:
quelle
@Offset + @Limit - 1
? Wenn @Limit 10 ist, werden 11 Zeilen zurückgegeben.Der beste Weg, dies zu tun, ohne Zeit für die Bestellung von Datensätzen zu verschwenden, ist folgender:
es dauert weniger als eine Sekunde!
beste Lösung für große Tische.
quelle
Ich habe jetzt eine Weile nach dieser Antwort gesucht (für generische Abfragen) und eine andere Möglichkeit gefunden, dies unter SQL Server 2000+ mit ROWCOUNT und Cursorn und ohne TOP oder eine temporäre Tabelle zu tun.
Mit
SET ROWCOUNT [OFFSET+LIMIT]
können Sie die Ergebnisse einschränken und mit Cursorn direkt zu der gewünschten Zeile gehen und dann bis zum Ende eine Schleife ausführen.Ihre Anfrage würde also so aussehen:
quelle
Mit SQL Server 2012 (11.x) und höher und Azure SQL Database können Sie auch "fetch_row_count_expression" und die ORDER BY-Klausel verwenden.
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Hinweis OFFSET Gibt die Anzahl der zu überspringenden Zeilen an, bevor Zeilen aus dem Abfrageausdruck zurückgegeben werden. Es ist NICHT die Nummer der Startzeile. Es muss also 0 sein, um den ersten Datensatz einzuschließen.
quelle