- 16.03.2017
- 11 Minuten zum Lesen
-
- V
- M
- r
- c
- d
-
+12
Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL-Datenbank Verwaltete Azure SQL-Instanz Azure Synapse Analytics Paralleles Data Warehouse
Begrenzt die in einer Abfrageergebnismenge zurückgegebenen Zeilen auf eine bestimmte Anzahl von Zeilen oder einen bestimmten Prozentsatz von Zeilen in SQL Server. Wenn Sie TOP mit der ORDER BY-Klausel verwenden, ist die Ergebnismenge auf die ersten N geordneten Zeilen beschränkt. Andernfalls gibt TOP die ersten N Zeilen in einer undefinierten Reihenfolge zurück. Verwenden Sie diese Klausel, um die Anzahl der von einer SELECT-Anweisung zurückgegebenen Zeilen anzugeben. Oder verwenden Sie TOP, um die Zeilen anzugeben, die von einer INSERT-, UPDATE-, MERGE- oder DELETE-Anweisung betroffen sind.
Transact-SQL-Syntaxkonventionen
Syntax
Es folgt die Syntax für SQL Server und Azure SQL-Datenbank:
Es folgt die Syntax für Azure Synapse Analytics und Parallel Data Warehouse:
Hinweis
Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 und frühere Versionen finden Sie in der Dokumentation zu früheren Versionen
Argumente
Ausdruck
Der numerische Ausdruck, der die Anzahl der zurückzugebenden Zeilen angibt. Ausdruck wird implizit in einen Gleitkommawert konvertiert, wenn Sie PERCENT angeben. Andernfalls wird der Ausdruck in bigint konvertiert.
PROZENT
Gibt an, dass die Abfrage nur den ersten Ausdruck in Prozent der Zeilen aus der Ergebnismenge zurückgibt. Bruchwerte werden auf den nächsten ganzzahligen Wert aufgerundet.
WITH TIES
Gibt zwei oder mehr Zeilen zurück, die den letzten Platz in der begrenzten Ergebnismenge belegen. Sie müssen dieses Argument mit der ORDER BY-Klausel verwenden. WITH TIES kann dazu führen, dass mehr Zeilen zurückgegeben werden als der im Ausdruck angegebene Wert. Wenn der Ausdruck beispielsweise auf 5 gesetzt ist, aber zwei zusätzliche Zeilen mit den Werten der ORDER BY-Spalten in Zeile 5 übereinstimmen, enthält die Ergebnismenge sieben Zeilen.
Sie können die TOP-Klausel mit WITH TIES angeben Argument nur in SELECT-Anweisungen und nur, wenn Sie auch die ORDER BY-Klausel angegeben haben. Die zurückgegebene Reihenfolge für das Binden von Datensätzen ist willkürlich. ORDER BY hat keinen Einfluss auf diese Regel.
Best Practices
Verwenden Sie in einer SELECT-Anweisung immer eine ORDER BY-Klausel mit der TOP-Klausel. Dies ist die einzige Möglichkeit, vorhersehbar anzugeben, welche Zeilen von TOP betroffen sind.
Verwenden Sie OFFSET und FETCH in der ORDER BY-Klausel anstelle der TOP-Klausel, um eine Abfrage-Paging-Lösung zu implementieren. Eine Paging-Lösung ( Das heißt, das Senden von Datenblöcken oder „Seiten“ von Daten an den Client ist mit OFFSET- und FETCH-Klauseln einfacher zu implementieren. Weitere Informationen finden Sie unter ORDER BY-Klausel (Transact-SQL).
Verwenden Sie TOP (oder OFFSET und FETCH) anstelle von SET ROWCOUNT, um die Anzahl der zurückgegebenen Zeilen zu begrenzen. Diese Methoden werden aus folgenden Gründen der Verwendung von SET ROWCOUNT vorgezogen:
- Als Teil einer SELECT-Anweisung das Abfrageoptimierungsprogramm kann den Wert des Ausdrucks in den TOP- oder FETCH-Klauseln während der Abfrageoptimierung berücksichtigen. Da Sie SET ROWCOUNT außerhalb einer Anweisung verwenden, die eine Abfrage ausführt, kann sein Wert in einem Abfrageplan nicht berücksichtigt werden.
Kompatibilitätsunterstützung
Aus Gründen der Abwärtskompatibilität sind die Klammern in SELECT-Anweisungen optional, wenn der Ausdruck eine ganzzahlige Konstante ist Ameise. Wir empfehlen, dass Sie in SELECT-Anweisungen immer Klammern für TOP verwenden. Dies bietet Konsistenz mit der erforderlichen Verwendung in INSERT-, UPDATE-, MERGE- und DELETE-Anweisungen.
Interoperabilität
Der TOP-Ausdruck wirkt sich nicht auf Anweisungen aus, die möglicherweise aufgrund eines Triggers ausgeführt werden. Die eingefügten und gelöschten Tabellen in den Triggern geben nur die Zeilen zurück, die wirklich von den Anweisungen INSERT, UPDATE, MERGE oder DELETE betroffen sind. Wenn beispielsweise ein INSERT TRIGGER als Ergebnis einer INSERT-Anweisung ausgelöst wird, die eine TOP-Klausel verwendet.
SQL Server ermöglicht das Aktualisieren von Zeilen über Ansichten. Da Sie die TOP-Klausel in die Ansichtsdefinition aufnehmen können, werden bestimmte Zeilen möglicherweise aus der Ansicht entfernt, wenn die Zeilen aufgrund einer Aktualisierung nicht mehr den Anforderungen des TOP-Ausdrucks entsprechen .
Wenn in der MERGE-Anweisung angegeben, gilt die TOP-Klausel, nachdem die gesamte Quelltabelle und die gesamte Zieltabelle verbunden wurden. Und die verknüpften Zeilen, die sich nicht zum Einfügen, Aktualisieren oder Löschen qualifizieren Aktion werden entfernt. Die TOP-Klausel reduziert die Anzahl der verknüpften Zeilen weiter auf den angegebenen Wert, und die Aktionen zum Einfügen, Aktualisieren oder Löschen gelten ungeordnet für die verbleibenden verknüpften Zeilen. Das heißt, es gibt keine Reihenfolge, in der die Zeilen auf die in den WHEN-Klauseln definierten Aktionen verteilt werden.Wenn beispielsweise die Angabe von TOP (10) 10 Zeilen betrifft, können von diesen Zeilen sieben aktualisiert und drei eingefügt werden. Oder einer kann gelöscht, fünf aktualisiert und vier eingefügt werden und so weiter. Da die MERGE-Anweisung einen vollständigen Tabellenscan sowohl der Quell- als auch der Zieltabelle durchführt, kann die E / A-Leistung beeinträchtigt werden, wenn Sie die TOP-Klausel verwenden, um eine große Tabelle durch Erstellen mehrerer Stapel zu ändern. In diesem Szenario ist es wichtig sicherzustellen, dass alle aufeinanderfolgenden Stapel auf neue Zeilen abzielen.
Seien Sie vorsichtig, wenn Sie die TOP-Klausel in einer Abfrage angeben, die UNION, UNION ALL, EXCEPT oder INTERSECT enthält Operator. Es ist möglich, eine Abfrage zu schreiben, die unerwartete Ergebnisse zurückgibt, da die Reihenfolge, in der die Klauseln TOP und ORDER BY logisch verarbeitet werden, nicht immer intuitiv ist, wenn diese Operatoren in einer Auswahloperation verwendet werden. Angenommen, Sie möchten anhand der folgenden Tabelle und der folgenden Daten das billigste rote und das billigste blaue Auto zurückgeben. Das heißt, die rote Limousine und der blaue Van.
Um diese Ergebnisse zu erzielen, können Sie die folgende Abfrage schreiben.
Es folgt die Ergebnismenge.
Die unerwarteten Ergebnisse werden zurückgegeben, da die TOP-Klausel logisch vor der ORDER BY-Klausel ausgeführt wird, die die Ergebnisse des Operators sortiert (in diesem Fall UNION ALL). Die vorherige Abfrage gibt also ein rotes und ein blaues Auto zurück und ordnet das Ergebnis dieser Vereinigung nach dem Preis. Das folgende Beispiel zeigt die richtige Methode zum Schreiben dieser Abfrage, um das gewünschte Ergebnis zu erzielen.
Durch die Verwendung von TOP und ORDER BY in einer Unterauswahloperation stellen Sie sicher, dass die Ergebnisse der ORDER BY-Klausel auf TOP angewendet werden Klausel und nicht das Ergebnis der UNION-Operation zu sortieren.
Hier ist die Ergebnismenge.
Einschränkungen und Einschränkungen
Wenn Sie TOP mit INSERT, UPDATE, MERGE oder DELETE verwenden, sind die referenzierten Zeilen nicht in beliebiger Reihenfolge angeordnet. Außerdem können Sie die ORDER BY-Klausel in diesen Anweisungen nicht direkt angeben. Wenn Sie TOP verwenden müssen, um Zeilen in einer aussagekräftigen chronologischen Reihenfolge einzufügen, zu löschen oder zu ändern, verwenden Sie TOP mit einer ORDER BY-Klausel, die in einer Subselect-Anweisung angegeben ist. Weitere Informationen finden Sie im folgenden Abschnitt mit Beispielen in diesem Artikel.
Sie können TOP nicht in UPDATE- und DELETE-Anweisungen für partitionierte Ansichten verwenden.
Sie können TOP nicht mit OFFSET und FETCH in kombinieren der gleiche Abfrageausdruck (im gleichen Abfragebereich). Weitere Informationen finden Sie unter ORDER BY-Klausel (Transact-SQL).
Beispiele
Kategorie | Empfohlene Syntaxelemente |
---|---|
Grundlegende Syntax | TOP • PROZENT |
Einschließlich Bindungswerte | MIT KRAWATTEN |
Begrenzen der von DELETE, INSERT oder UPDATE betroffenen Zeilen | DELETE • INSERT • UPDATE |
Grundlegende Syntax
Beispiele in diesem Abschnitt veranschaulichen die grundlegende Funktionalität der ORDER BY-Klausel unter Verwendung der minimal erforderlichen Syntax.
EIN. Verwenden von TOP mit einem konstanten Wert
In den folgenden Beispielen wird anhand eines konstanten Werts die Anzahl der Mitarbeiter angegeben, die in der Abfrageergebnismenge zurückgegeben werden. Im ersten Beispiel werden die ersten 10 undefinierten Zeilen zurückgegeben, da eine ORDER BY-Klausel nicht verwendet wird. Im zweiten Beispiel wird eine ORDER BY-Klausel verwendet, um die 10 zuletzt eingestellten Mitarbeiter zurückzugeben.
B. Verwenden von TOP mit einer Variablen
Im folgenden Beispiel wird anhand einer Variablen die Anzahl der Mitarbeiter angegeben, die in der Abfrageergebnismenge zurückgegeben werden.
C. Angeben eines Prozentsatzes
Im folgenden Beispiel wird PERCENT verwendet, um die Anzahl der Mitarbeiter anzugeben, die in der Abfrageergebnismenge zurückgegeben werden. Es gibt 290 Mitarbeiter in der Tabelle HumanResources.Employee
. Da fünf Prozent von 290 ein Bruchwert sind, wird der Wert auf die nächste ganze Zahl aufgerundet.
Einschließen von Verbindungswerten
A. Verwenden von WITH TIES zum Einschließen von Zeilen, die mit den Werten in der letzten Zeile übereinstimmen
Im folgenden Beispiel wird die oberste 10
Prozent aller Mitarbeiter mit dem höchsten Gehalt a nd gibt sie in absteigender Reihenfolge entsprechend ihrem Gehalt zurück. Durch die Angabe von WITH TIES
wird sichergestellt, dass Mitarbeiter mit Gehältern, die dem niedrigsten zurückgegebenen Gehalt (der letzten Zeile) entsprechen, auch dann in die Ergebnismenge aufgenommen werden, wenn sie 10
Prozent der Mitarbeiter.
Begrenzung der von DELETE, INSERT oder UPDATE betroffenen Zeilen
A. Verwenden von TOP zum Begrenzen der Anzahl der gelöschten Zeilen
Wenn Sie eine TOP (n) -Klausel mit DELETE verwenden, wird der Löschvorgang für eine undefinierte Auswahl von n Zeilen durchgeführt. Das heißt, die DELETE-Anweisung wählt eine beliebige (n) Anzahl von Zeilen aus, die die in der WHERE-Klausel definierten Kriterien erfüllen.Im folgenden Beispiel werden 20
-Zeilen aus der Tabelle PurchaseOrderDetail
gelöscht, deren Fälligkeitsdatum vor dem 1. Juli 2002 liegt.
Wenn Sie TOP verwenden möchten, um Zeilen in einer aussagekräftigen chronologischen Reihenfolge zu löschen, verwenden Sie TOP mit ORDER BY in einer Subselect-Anweisung. Die folgende Abfrage löscht die 10 Zeilen der Tabelle PurchaseOrderDetail
mit den frühesten Fälligkeitsterminen. Um sicherzustellen, dass nur 10 Zeilen gelöscht werden, ist die in der Unterauswahlanweisung angegebene Spalte (PurchaseOrderID
) der Primärschlüssel der Tabelle. Die Verwendung einer Nichtschlüsselspalte in der Unterauswahlanweisung kann zum Löschen von mehr als 10 Zeilen führen, wenn die angegebene Spalte doppelte Werte enthält.
B. Verwenden von TOP zum Begrenzen der Anzahl der eingefügten Zeilen
Im folgenden Beispiel wird die Tabelle EmployeeSales
erstellt und der Name und die Verkaufsdaten für das aktuelle Jahr für die Top 5 eingefügt Mitarbeiter aus der Tabelle HumanResources.Employee
. Die INSERT-Anweisung wählt fünf beliebige Zeilen aus, die von der Anweisung SELECT
zurückgegeben werden und die in der WHERE-Klausel definierten Kriterien erfüllen. Die OUTPUT-Klausel zeigt die Zeilen an, die in die Tabelle EmployeeSales
eingefügt werden. Beachten Sie, dass die ORDER BY-Klausel in der SELECT-Anweisung nicht zum Bestimmen der fünf besten Mitarbeiter verwendet wird.
Wenn Sie TOP verwenden möchten, um Zeilen in einer aussagekräftigen chronologischen Reihenfolge einzufügen, verwenden Sie TOP mit ORDER BY in a Anweisung subselect. Das folgende Beispiel zeigt, wie dies gemacht wird. Die OUTPUT-Klausel zeigt die Zeilen an, die in die Tabelle EmployeeSales
eingefügt werden. Beachten Sie, dass die fünf besten Mitarbeiter jetzt basierend auf den Ergebnissen eingefügt werden der ORDER BY-Klausel anstelle von undefinierten Zeilen.
C. Verwenden von TOP, um die Anzahl der aktualisierten Zeilen zu begrenzen
Das folgende Beispiel verwendet die TOP-Klausel zum Aktualisieren von Zeilen in einer Tabelle. Wenn Sie eine TOP (n) -Klausel mit UPDATE verwenden, wird die Aktualisierungsoperation für eine undefinierte Anzahl von Zeilen ausgeführt. Das heißt, die UPDATE-Anweisung wählt eine beliebige (n) Anzahl von Zeilen aus, die übereinstimmen Die in der WHERE-Klausel definierten Kriterien. Im folgenden Beispiel werden 10 Kunden von einem Verkäufer einem anderen zugewiesen.
Wenn erforderlich Verwenden Sie TOP, um Aktualisierungen in einer aussagekräftigen Chronologie anzuwenden. Sie müssen TOP zusammen mit ORDER BY in einer Subselect-Anweisung verwenden. Im folgenden Beispiel werden die Urlaubszeiten der 10 Mitarbeiter mit den frühesten Einstellungsdaten aktualisiert.
Beispiele: Azure Synapse Analytics und Parallel Data Warehouse
Im folgenden Beispiel werden die obersten 31 Zeilen zurückgegeben, die den Abfragekriterien entsprechen. Die ORDER BY-Klausel stellt sicher, dass die 31 zurückgegebenen Zeilen die ersten 31 Zeilen sind, basierend auf einer alphabetischen Reihenfolge der Spalte LastName
.
Verwenden von TOP ohne Angabe von Bindungen.
Ergebnis: 31 Zeilen werden zurückgegeben.
Verwenden von TOP unter Angabe von WITH TIES.
Ergebnis: 33 Zeilen werden zurückgegeben, da drei Mitarbeiter mit dem Namen Brown tie für die 31. Zeile benannt sind.