Was ist der Unterschied zwischen TOP und OFFSET & Fetch?

Sowohl TOP als auch OFFSET & FETCH kann verwendet werden Begrenzen Sie die Anzahl der zurückgegebenen Zeilen. OFFSET und FETCH können ähnliche Ergebnisse nach oben zurückgeben, es gibt jedoch Unterschiede, die Einfluss darauf haben können, welche Methode für Sie in der jeweiligen Situation am besten geeignet ist.

Alle Beispiele für diese Lektion basieren auf Microsoft SQL Server Management Studio und die AdventureWorks2012-Datenbank. Sie können mit diesen kostenlosen Tools in meinem Handbuch Erste Schritte mit SQL Server beginnen.

Was ist der Unterschied zwischen TOP und OFFSET & Abrufen?

In den folgenden Abschnitten behandeln wir TOP und OFFSET & FETCH. Ich denke, wenn Sie beide Abschnitte gelesen haben, werden Sie ihre Unterschiede verstehen. Diese werden auch in einer Tabelle am Ende dieses Artikels zusammengefasst.

Top

TOP wird verwendet, um eine bestimmte Anzahl von Zeilen aus einem Abfrageergebnis zurückzugeben.

Die TOP-Klausel ist seit einiger Zeit in älteren Versionen von SQL Server wie SQL 2005 verfügbar. TOP ist nicht ANSI-kompatibel und wird ausschließlich auf Microsoft-Produkte wie SQL Server und MS-Access beschränkt.

Die TOP-Klausel wird in der Spaltenliste der SELECT-Anweisung verwendet und kann mit oder ohne ORDER BY verwendet werden.

Um beispielsweise die zehn kostengünstigsten Produkte auszuwählen, verwenden Sie

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

Obwohl ORDER BY nicht erforderlich ist, ist es eine bewährte Methode, da Sie ohne diese Option keine Garantie dafür haben, welche Zeilen zurückgegeben werden.

Ein für TOP eindeutiges Element ist die Fähigkeit, einen Prozentsatz von Zeilen zurückzugeben. Die Anweisung

SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

gibt die Top-51-Produkte mit den niedrigsten Standardkosten zurück (dh 504 Zeilen x 10% = 50,4, auf 51 aufgerundet).

Sie können auch eine bestimmte Anzahl von Datensätzen am Ende eines Abfrageergebnisses auswählen. Dazu können Sie die Datensätze mit einem Trick in absteigender Reihenfolge sortieren:

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC

Beachten Sie, wenn die Ergebnisse in absteigender Reihenfolge sortiert werden Die größten Beträge werden zuerst zurückgegeben. Aus diesem Grund gibt TOP die Produkte mit den höchsten Standardkosten zurück.

TOP kann bei großen Ergebnissen sehr nützlich sein, da die Rückgabe von Tausenden von Zeilen die Leistung beeinträchtigen kann. In vielen Fällen durchsucht die Verwendung nur den Anfangsteil der Ergebnisse.

TOP kann Bindungswerte anzeigen. Mit WITH TIES können Sie auch zusätzliche Datensätze anzeigen, die denselben Wert wie die letzte Zeile aus dem Basisergebnis haben.

OFFSET und FETCH

OFFSET und FETCH werden verwendet, um ein Fenster mit Datensätzen aus einer Ergebnismenge zurückzugeben. OFFSET gibt an, wie viele Zeilen innerhalb des Ergebnisses übersprungen werden sollen, und FETCH gibt an, wie viele Zeilen von diesem Punkt an im Ergebnis zurückgegeben werden sollen.

OFFSET und FETCH wurden kürzlich in SQL Server 2012 eingeführt und sind ANSI-kompatibel.

Sie können OFFSET ohne FETCH verwenden, aber FETCH kann nicht alleine verwendet werden. Unabhängig davon muss OFFSET mit einer ORDER BY-Klausel verwendet werden. Der Grund ist einfach, da OFFSET und FETCH Teil der ORDER BY-Klausel sind.

In diesem Beispiel werden die ersten zehn Zeilen des Ergebnisses übersprungen und die nächsten 10 im Ergebnis angezeigt.

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

Sie können die von TOP zurückgegebenen Zeilen mit OFFSET und FETCH replizieren, sofern die Ergebnisse geordnet sind. Die folgende Anweisung entspricht der Rückgabe von TOP 10:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Wenn OFFSET auf 0 gesetzt ist, werden keine Zeilen übersprungen.

Im Gegensatz dazu TOP, mit OFFSET gibt es keine eingebauten Mittel, um einen Prozentsatz der Zeilen zurückzugeben. Sie können jedoch Ihren eigenen würfeln, indem Sie den Prozentsatz wie folgt berechnen:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY

Der Trick liegt in der Unterabfrage. Durch Berechnung der Anzahl der Zeilen im Ergebnis können wir dann einen Prozentsatz erhalten. Hier ist die Unterabfrage. Wenn Sie möchten, können Sie dies in SQL Server Management Studio ausführen.

SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product

Es gibt mehrere Elemente zu beachten:

  • CEILING rundet Zahlen auf. In unserem Beispiel gibt CEILING (50.4) 51.0 zurück. Dies ahmt das Verhalten von TOP nach.
  • FETCH erfordert einen ganzzahligen Wert, sodass CAST für diese Konvertierung verwendet wird. Somit wird 51.0 zu 51

Um die unteren 10 Datensätze eines Ergebnisses zurückzugeben, gibt es zwei Methoden. Wir können die Sortierreihenfolge wie für TOP umkehren:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Oder wir können die Sortierreihenfolge beibehalten und den Versatz so berechnen, dass alle Zeilen bis zum letzten zehn werden übersprungen. Wir werden diese Technik in der SQL-Lektion über OFFSET und FETCH genauer untersuchen.

Zusammenfassung der Unterschiede

Hier finden Sie eine Zusammenfassung einiger der Hauptunterschiede zwischen TOP und OFFSET & FETCH.

Vergleich von TOP mit OFFSET & FETCH

Wenn Sie im Allgemeinen nur die ersten Zeilen zurückgeben möchten, ist TOP meiner Meinung nach eine einfache Lösung. Wenn Sie nach einer Paging-Lösung suchen oder Zeilen in der Mitte oder unten in den Abfrageergebnissen auswählen müssen, ohne die ursprüngliche Sortierreihenfolge zu beeinflussen, dann denke ich, OFFSET & FETCH sind am besten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.