Ich versuche so etwas wie:
SELECT * FROM table LIMIT 10,20
oder
SELECT * FROM table LIMIT 10 OFFSET 10
aber mit SQL Server
Die einzige Lösung, die ich gefunden habe, sieht nach Overkill aus:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
Ich fand auch :
SELECT TOP 10 * FROM stuff;
... aber es ist nicht das, was ich tun möchte, da ich das Startlimit nicht angeben kann.
Gibt es eine andere Möglichkeit für mich, das zu tun?
Nur neugierig, gibt es einen Grund, warum SQL Server die LIMIT
Funktion oder ähnliches nicht unterstützt? Ich möchte nicht gemein sein, aber das klingt wirklich nach etwas, das ein DBMS braucht ... Wenn ja, dann tut es mir leid, dass ich so unwissend bin! Ich arbeite seit 5 Jahren mit MySQL und SQL +, also ...
sql
sql-server
pagination
limit
marcgg
quelle
quelle
ROW_NUMBER()
und eine BegrenzungTOP
für die Breite des Bereichs und eineWHERE
Bedingung für eine Grenze des Bereichs zu verwenden, die ich erreichen konnte. Ich habe auch eine viel bessere Leistung festgestellt, wenn dieTOP
Klausel ein Literal anstelle einer Variablen verwendetAntworten:
Die
LIMIT
Klausel ist nicht Teil von Standard-SQL. Es wird als Herstellererweiterung von SQL von MySQL, PostgreSQL und SQLite unterstützt.Andere Datenbankmarken verfügen möglicherweise über ähnliche Funktionen (z. B.
TOP
in Microsoft SQL Server), diese funktionieren jedoch nicht immer identisch.TOP
In Microsoft SQL Server ist es schwierig, dieLIMIT
Klausel nachzuahmen . Es gibt Fälle, in denen es einfach nicht funktioniert.Die von Ihnen gezeigte Lösung
ROW_NUMBER()
ist in Microsoft SQL Server 2005 und höher verfügbar. Dies ist (vorerst) die beste Lösung, die ausschließlich als Teil der Abfrage funktioniert.Eine andere Lösung besteht darin
TOP
, die ersten Zeilen mit Anzahl + Versatz abzurufen und dann mithilfe der API nach den ersten Versatzzeilen zu suchen .Siehe auch:
quelle
Für SQL Server 2012 + können Sie verwenden .
quelle
offset
oder können Sie diese Zeile weglassen (vorausgesetzt, Sie möchten keinen Versatz)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
Wie Sie festgestellt haben, ist dies die bevorzugte SQL Server-Methode:
quelle
a
nach der inneren Auswahl? Ich nehme an, Sie geben der inneren Auswahl einen Alias, aber dann scheinen Sie ihn nie zu verwenden ... Sollten Sie danna.row
statt nur tunrow
?( )
abgeleiteten Tabelle einfügen, dieser wird jedoch freigegeben, wenn Sie dann vergessen, ihn zum Verweisen auf die Spalten zu verwenden. Ich habe es aber behoben ...Wenn Sie mit SQL Server 2012+ Votum für Martin Smith Antwort und verwenden Sie die
OFFSET
undFETCH NEXT
ErweiterungenORDER BY
,Wenn Sie das Pech haben, an einer früheren Version festzuhalten, können Sie so etwas tun:
Ich glaube, ist funktional gleichbedeutend mit
und die leistungsstärkste Art und Weise, wie ich sie in TSQL vor MS SQL 2012 kenne.
Wenn sehr viele Zeilen vorhanden sind, erzielen Sie möglicherweise eine bessere Leistung, wenn Sie eine temporäre Tabelle anstelle eines CTE verwenden.
quelle
Leider ist das
ROW_NUMBER()
das Beste, was Sie tun können. Es ist tatsächlich korrekter, weil die Ergebnisse einerlimit
odertop
-Klausel ohne Berücksichtigung einer bestimmten Reihenfolge keine wirkliche Bedeutung haben. Aber es ist immer noch ein Schmerz zu tun.Update: SQL Server 2012 fügt eine
limit
ähnliche Funktion über die Schlüsselwörter OFFSET und FETCH hinzu . Dies ist der Ansi-Standard-Ansatz im Gegensatz zuLIMIT
einer nicht standardmäßigen MySql-Erweiterung.quelle
Wie wäre es damit?
Es gibt Ihnen die letzten 10 Zeilen der ersten 20 Zeilen. Ein Nachteil ist, dass die Reihenfolge umgekehrt ist, aber zumindest ist es leicht zu merken.
quelle
Sollte Aufzeichnungen 11-20 geben. Wahrscheinlich nicht zu effizient, wenn Sie inkrementieren, um weitere Seiten zu erhalten, und nicht sicher sind, wie sich dies auf die Bestellung auswirkt. Möglicherweise muss dies in beiden WHERE-Anweisungen angegeben werden.
quelle
Ein guter Weg ist, eine Prozedur zu erstellen:
Genau wie Limit 0,2 //////////////// Paginierung 0,4 ausführen
quelle
Nur für die Datensatzlösung, die in den meisten Datenbankmodulen funktioniert, ist sie möglicherweise nicht die effizienteste:
Pelase-Hinweis: Die letzte Seite würde immer noch ReturnCount-Zeilen enthalten, unabhängig davon, was SkipCount ist. Aber das könnte in vielen Fällen eine gute Sache sein.
quelle
Das Äquivalent von LIMIT ist SET ROWCOUNT. Wenn Sie jedoch eine generische Paginierung wünschen, ist es besser, eine Abfrage wie die folgende zu schreiben:
quelle
Druckt Zeilen von 10 bis 15.
quelle
Bisher funktioniert dieses Format für mich (allerdings nicht die beste Leistung):
Ein Hinweis nebenbei, das Paginieren über dynamische Daten kann zu seltsamen / unerwarteten Ergebnissen führen.
quelle
In der Online-Dokumentation zu MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ) finden Sie hier ein Beispiel, das ich getestet habe und das zum Abrufen eines bestimmten Satzes von Zeilen funktioniert. ROW_NUMBER erfordert ein OVER, aber Sie können nach Belieben bestellen:
quelle
Verwenden Sie alle SQL Server :; mit tbl als (SELECT ROW_NUMBER () over (Reihenfolge nach (Auswahl 1)) als RowIndex, * aus Tabelle) wählen Sie Top 10 * aus tbl aus, wobei RowIndex> = 10
quelle
Es wird von 15 bis 25 als gleiches Limit in MYSQl gedruckt
quelle