- 16-03-2017
- 11 minuten om te lezen
-
- V
- M
- r
- c
- d
-
+12
Is van toepassing op: SQL Server (alle ondersteunde versies) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Beperkt het aantal rijen dat in een queryresultaatset wordt geretourneerd tot een bepaald aantal rijen of een percentage rijen in SQL Server. Wanneer u TOP gebruikt met de ORDER BY-component, is de resultaatset beperkt tot het eerste N aantal geordende rijen. Anders retourneert TOP het eerste N aantal rijen in een ongedefinieerde volgorde. Gebruik deze clausule om het aantal rijen op te geven dat wordt geretourneerd door een SELECT-instructie. Of gebruik TOP om de rijen op te geven die worden beïnvloed door een INSERT-, UPDATE-, MERGE- of DELETE-instructie.
Transact-SQL-syntaxisconventies
Syntaxis
Hieronder volgt de syntaxis voor SQL Server en Azure SQL Database:
Hieronder volgt de syntaxis voor Azure Synapse Analytics en Parallel Datawarehouse:
Opmerking
Zie de documentatie van eerdere versies om de Transact-SQL-syntaxis voor SQL Server 2014 en eerder te bekijken .
Argumenten
uitdrukking
De numerieke uitdrukking die het aantal rijen specificeert dat moet worden geretourneerd. expressie wordt impliciet geconverteerd naar een float-waarde als u PERCENT opgeeft. Anders wordt expressie geconverteerd naar bigint.
PERCENT
Geeft aan dat de query alleen het eerste expressiepercentage van rijen uit de resultaatset retourneert. Breukwaarden worden naar boven afgerond op het volgende gehele getal.
MET BANDEN
Geeft als resultaat twee of meer rijen die gelijk zijn aan de laatste plaats in de set met beperkte resultaten. U moet dit argument gebruiken met de ORDER BY-component. WITH TIES kan ertoe leiden dat er meer rijen worden geretourneerd dan de waarde die is opgegeven in expression. Als expressie bijvoorbeeld is ingesteld op 5 maar twee extra rijen overeenkomen met de waarden van de ORDER BY-kolommen in rij 5, bevat de resultatenset zeven rijen.
U kunt de TOP-clausule specificeren met de WITH TIES argument alleen in SELECT-instructies, en alleen als je ook de ORDER BY-clausule hebt gespecificeerd. De geretourneerde volgorde van koppelingsrecords is willekeurig. ORDER BY heeft geen invloed op deze regel.
Best Practices
Gebruik in een SELECT-instructie altijd een ORDER BY-clausule met de TOP-clausule. Omdat dit de enige manier is om voorspelbaar aan te geven welke rijen worden beïnvloed door TOP.
Gebruik OFFSET en FETCH in de ORDER BY-clausule in plaats van de TOP-clausule om een query-paging-oplossing te implementeren. Een paging-oplossing ( dat wil zeggen, het verzenden van brokken of “paginas” met gegevens naar de client) is gemakkelijker te implementeren met behulp van OFFSET- en FETCH-clausules. Zie voor meer informatie ORDER BY-clausule (Transact-SQL).
Gebruik TOP (of OFFSET en FETCH) in plaats van SET ROWCOUNT om het aantal geretourneerde rijen te beperken. Deze methoden hebben de voorkeur boven het gebruik van SET ROWCOUNT om de volgende redenen:
- Als onderdeel van een SELECT-instructie, de query-optimizer kan rekening houden met de waarde van expressie in de TOP- of FETCH-clausules tijdens query-optimalisatie. Omdat u SET ROWCOUNT gebruikt buiten een instructie die een query uitvoert, kan de waarde ervan “niet worden meegenomen in een queryplan.
Compatibiliteitsondersteuning
Voor achterwaartse compatibiliteit zijn de haakjes optioneel in SELECT-instructies als de uitdrukking een geheel getal is const mier. We raden je aan om altijd haakjes te gebruiken voor TOP in SELECT-instructies. Dit zorgt voor consistentie met het vereiste gebruik in INSERT-, UPDATE-, MERGE- en DELETE-instructies.
Interoperabiliteit
De TOP-expressie heeft geen invloed op instructies die zouden kunnen worden uitgevoerd vanwege een trigger. De ingevoegde en verwijderde tabellen in de triggers retourneren alleen de rijen die echt worden beïnvloed door de INSERT-, UPDATE-, MERGE- of DELETE-instructies. Als een INSERT TRIGGER bijvoorbeeld wordt geactiveerd als resultaat van een INSERT-instructie die een TOP-component gebruikte.
SQL Server maakt het bijwerken van rijen via views mogelijk. Omdat u de TOP-clausule in de viewdefinitie kunt opnemen, kunnen bepaalde rijen uit de view verdwijnen als de rijen niet langer voldoen aan de vereisten van de TOP-expressie vanwege een update .
Indien gespecificeerd in de MERGE-instructie, is de TOP-clausule van toepassing nadat de volledige brontabel en de volledige doeltabel zijn samengevoegd. En de samengevoegde rijen die niet in aanmerking komen voor een invoeging, update of verwijdering actie worden verwijderd. De TOP-clausule reduceert het aantal gekoppelde rijen verder tot de opgegeven waarde en de acties voor invoegen, bijwerken of verwijderen zijn op ongeordende wijze van toepassing op de resterende gekoppelde rijen. Dat wil zeggen, er is geen volgorde waarin de rijen worden verdeeld over de acties die zijn gedefinieerd in de WHEN-clausules.Als het specificeren van TOP (10) bijvoorbeeld van invloed is op 10 rijen, kunnen van deze rijen er zeven worden bijgewerkt en drie worden ingevoegd. Of er kan er één worden verwijderd, vijf worden bijgewerkt en vier worden ingevoegd, enzovoort. Omdat de MERGE-instructie een volledige tabelscan van zowel de bron- als de doeltabellen uitvoert, kunnen de I / O-prestaties worden beïnvloed wanneer u de TOP-clausule gebruikt om een grote tabel te wijzigen door meerdere batches te maken. In dit scenario is het belangrijk ervoor te zorgen dat alle opeenvolgende batches gericht zijn op nieuwe rijen.
Wees voorzichtig wanneer u de TOP-clausule opnieuw specificeert in een query die een UNION, UNION ALL, EXCEPT of INTERSECT bevat operator. Het is mogelijk om een query te schrijven die onverwachte resultaten oplevert, omdat de volgorde waarin de TOP- en ORDER BY-clausules logisch worden verwerkt, niet altijd intuïtief is wanneer deze operatoren worden gebruikt in een selectiebewerking. Ga er bijvoorbeeld vanuit de volgende tabel en gegevens van uit dat u de minst dure rode auto en de minst dure blauwe auto wilt retourneren. Dat wil zeggen, de rode sedan en de blauwe bestelwagen.
Om deze resultaten te bereiken, zou je de volgende zoekopdracht kunnen schrijven.
Hieronder volgt de resultaatset.
De onverwachte resultaten worden geretourneerd omdat de TOP-clausule logisch vóór de ORDER BY-component wordt uitgevoerd, die de resultaten van de operator sorteert (UNION ALL in dit geval). Dus de vorige zoekopdracht retourneert een rode auto en een blauwe auto en rangschikt vervolgens het resultaat van die unie op basis van de prijs. Het volgende voorbeeld toont de juiste methode om deze query te schrijven om het gewenste resultaat te bereiken.
Door TOP en ORDER BY te gebruiken in een subselectie, zorgt u ervoor dat de resultaten van de ORDER BY-component worden toegepast op de TOP clausule en niet om het resultaat van de UNION-bewerking te sorteren.
Hier is de resultatenset.
Beperkingen en beperkingen
Wanneer u TOP gebruikt met INSERT, UPDATE, MERGE of DELETE, worden de rijen waarnaar wordt verwezen niet in een willekeurige volgorde gerangschikt. En u kunt de ORDER BY-component niet rechtstreeks specificeren in deze instructies. Als u TOP moet gebruiken om rijen in een zinvolle chronologische volgorde in te voegen, te verwijderen of te wijzigen, gebruik dan TOP met een ORDER BY-component die is gespecificeerd in een subselect-instructie. Zie de volgende voorbeeldensectie in dit artikel.
Je kunt “TOP niet gebruiken in een UPDATE- en DELETE-instructies op gepartitioneerde weergaven.
Je kunt TOP niet combineren met OFFSET en FETCH in dezelfde query-expressie (in hetzelfde querybereik). Zie ORDER BY-clausule (Transact-SQL) voor meer informatie.
Voorbeelden
Categorie | Aanbevolen syntaxiselementen |
---|---|
Basissyntaxis | TOP • PERCENT |
Inclusief koppelwaarden | MET BANDEN |
Beperking van de rijen die worden beïnvloed door DELETE, INSERT of UPDATE | DELETE • INSERT • UPDATE |
Basissyntaxis
Voorbeelden in deze sectie demonstreren de basisfunctionaliteit van de ORDER BY-clausule met behulp van de minimaal vereiste syntaxis.
EEN. TOP gebruiken met een constante waarde
De volgende voorbeelden gebruiken een constante waarde om het aantal werknemers op te geven dat wordt geretourneerd in de queryresultatenet. In het eerste voorbeeld worden de eerste 10 ongedefinieerde rijen geretourneerd omdat er geen ORDER BY-clausule wordt “niet gebruikt. In het tweede voorbeeld wordt een ORDER BY-clausule gebruikt om de top 10 recent aangenomen werknemers te retourneren.
B. TOP gebruiken met een variabele
In het volgende voorbeeld wordt een variabele gebruikt om het aantal werknemers op te geven dat wordt geretourneerd in de queryresultatenet.
C. Een percentage specificeren
In het volgende voorbeeld wordt PERCENT gebruikt om het aantal werknemers op te geven dat wordt geretourneerd in de queryresultatenet. Er zijn 290 werknemers in de tabel HumanResources.Employee
. Omdat vijf procent van 290 een fractionele waarde is, wordt de waarde naar boven afgerond op het volgende gehele getal.
Inclusief tie-waarden
A. Gebruik WITH TIES om rijen op te nemen die overeenkomen met de waarden in de laatste rij
In het volgende voorbeeld wordt de top 10
procent van alle werknemers met het hoogste salaris a nd geeft ze terug in aflopende volgorde op basis van hun salaris. Als u WITH TIES
opgeeft, zorgt u ervoor dat werknemers met een salaris gelijk aan het laagste geretourneerde salaris (de laatste rij) ook worden opgenomen in de resultatenset, zelfs als dit hoger is dan 10
percentage werknemers.
Beperking van de rijen die worden beïnvloed door DELETE, INSERT of UPDATE
A. TOP gebruiken om het aantal verwijderde rijen te beperken
Wanneer u een TOP (n) -clausule gebruikt met DELETE, wordt de verwijderbewerking uitgevoerd op een ongedefinieerde selectie van n aantal rijen. Dat wil zeggen, de DELETE-instructie kiest een willekeurig (n) aantal rijen die voldoen aan de criteria die zijn gedefinieerd in de WHERE-clausule.In het volgende voorbeeld worden 20
rijen verwijderd uit de tabel PurchaseOrderDetail
met vervaldatums eerder dan 1 juli 2002.
Als u TOP wilt gebruiken om rijen in een zinvolle chronologische volgorde te verwijderen, gebruik dan TOP met ORDER BY in een subselectie-instructie. De volgende zoekopdracht verwijdert de 10 rijen van de PurchaseOrderDetail
-tabel met de vroegste vervaldatums. Om ervoor te zorgen dat slechts 10 rijen worden verwijderd, is de kolom die is opgegeven in de subselect-instructie (PurchaseOrderID
) de primaire sleutel van de tabel. Het gebruik van een niet-sleutelkolom in de subselect-instructie kan resulteren in het verwijderen van meer dan 10 rijen als de opgegeven kolom dubbele waarden bevat.
B. TOP gebruiken om het aantal ingevoegde rijen te beperken
Het volgende voorbeeld maakt de tabel EmployeeSales
en voegt de naam en de verkoopgegevens van het jaar tot nu toe voor de top vijf in werknemers uit de tabel HumanResources.Employee
. De instructie INSERT kiest vijf willekeurige rijen die worden geretourneerd door de instructie SELECT
die voldoen aan de criteria die zijn gedefinieerd in de WHERE-component. De OUTPUT-clausule toont de rijen die in de EmployeeSales
-tabel zijn ingevoegd. Merk op dat de ORDER BY-clausule in de SELECT-instructie niet wordt gebruikt om de top vijf werknemers te bepalen.
Als u TOP wilt gebruiken om rijen in een zinvolle chronologische volgorde in te voegen, gebruik dan TOP met ORDER BY in een subselect-instructie. Het volgende voorbeeld laat zien hoe u dit moet doen. De OUTPUT-clausule toont de rijen die zijn ingevoegd in de EmployeeSales
-tabel. Merk op dat de top vijf werknemers nu worden ingevoegd op basis van de resultaten van de ORDER BY-component in plaats van ongedefinieerde rijen.
C. TOP gebruiken om het aantal bijgewerkte rijen te beperken
Het volgende voorbeeld gebruikt de TOP-clausule om rijen in een tabel bij te werken. Wanneer u een TOP (n) -component gebruikt met UPDATE, wordt de updatebewerking uitgevoerd op een ongedefinieerd aantal rijen. Dat wil zeggen dat de instructie UPDATE een willekeurig (n) aantal rijen kiest dat voldoet aan de criteria die zijn gedefinieerd in de WHERE-clausule. In het volgende voorbeeld worden 10 klanten toegewezen van de ene verkoper aan de andere.
Als het moet gebruik TOP om updates toe te passen in een zinvolle chronologie, u moet TOP samen met ORDER BY gebruiken in een subselectie-instructie. In het volgende voorbeeld worden de vakantie-uren bijgewerkt van de 10 werknemers met de vroegste huurdatums.
Voorbeelden: Azure Synapse Analytics en Parallel Data Warehouse
In het volgende voorbeeld worden de bovenste 31 rijen geretourneerd die voldoen aan de zoekcriteria. De ORDER BY-component zorgt ervoor dat de 31 geretourneerde rijen de eerste 31 rijen zijn, gebaseerd op een alfabetische volgorde van de LastName
kolom.
TOP gebruiken zonder banden op te geven.
Resultaat: 31 rijen worden geretourneerd.
TOP gebruiken en WITH TIES specificeren.
Resultaat: 33 rijen worden geretourneerd, omdat drie werknemers met de naam Brown gelijkspel vormen voor de 31e rij.