- 03/16/2017
- 11 minutter at læse
-
- V
- M
- r
- c
- d
-
+12
Gælder for: SQL Server (alle understøttede versioner) Azure SQL-database Azure SQL-administreret forekomst Azure Synapse Analytics Parallelt datalager
Begrænser de rækker, der returneres i et forespørgselsresultat, til et specificeret antal rækker eller procentdel af rækker i SQL Server. Når du bruger TOP med ORDER BY-klausulen, er resultatsættet begrænset til det første N antal bestilte rækker. Ellers returnerer TOP det første N antal rækker i en udefineret rækkefølge. Brug denne klausul til at angive antallet af rækker, der returneres fra en SELECT-sætning. Eller brug TOP til at specificere de rækker, der er påvirket af en INSERT-, UPDATE-, MERGE- eller DELETE-sætning.
Transact-SQL-syntakskonventioner
Syntaks
Følgende er syntaksen for SQL Server og Azure SQL Database:
Følgende er syntaks for Azure Synapse Analytics og Parallel Datavarehus:
Bemærk
For at se Transact-SQL-syntaks til SQL Server 2014 og tidligere, se dokumentation til tidligere versioner .
Argumenter
udtryk
Det numeriske udtryk, der angiver antallet af rækker, der skal returneres. udtryk konverteres implicit til en float-værdi, hvis du angiver PERCENT. Ellers konverteres udtryk til bigint.
PERCENT
Angiver, at forespørgslen kun returnerer den første ekspressionsprocent af rækker fra resultatsættet. Brøkværdier afrundes op til næste heltalsværdi.
MED BINDER
Returnerer to eller flere rækker, der binder til sidste plads i det begrænsede resultatsæt. Du skal bruge dette argument med ORDER BY-klausulen. WITH TIES kan medføre, at flere rækker returneres end den værdi, der er angivet i udtrykket. For eksempel, hvis udtrykket er indstillet til 5, men to ekstra rækker matcher værdierne for ORDER BY-kolonnerne i række 5, vil resultatsættet indeholde syv rækker.
Du kan angive TOP-klausulen med WITH TIES argument kun i SELECT-sætninger, og kun hvis du “også har specificeret ORDER BY-klausulen. Den returnerede rækkefølge for binding af poster er vilkårlig. ORDER BY påvirker ikke denne regel.
Bedste fremgangsmåder
I en SELECT-sætning skal du altid bruge en ORDER BY-klausul med TOP-klausulen. Fordi det er den eneste måde at forudsige, hvilke rækker der er påvirket af TOP.
Brug OFFSET og FETCH i ORDER BY-klausulen i stedet for TOP-klausulen til at implementere en forespørgselssøgningsløsning. En personsøgningsløsning ( at sende klumper eller “sider” med data til klienten) er lettere at implementere ved hjælp af OFFSET- og FETCH-klausuler. For mere information, se ORDER BY-klausul (Transact-SQL).
Brug TOP (eller OFFSET og FETCH) i stedet for SET ROWCOUNT for at begrænse antallet af returnerede rækker. Disse metoder foretrækkes frem for SET ROWCOUNT af følgende årsager:
- Som en del af en SELECT-sætning er forespørgselsoptimering kan overveje udtrykets værdi i TOP- eller FETCH-klausulerne under optimering af forespørgsel. Da du bruger SET ROWCOUNT uden for en sætning, der kører en forespørgsel, kan dens værdi ikke tages med i en forespørgselsplan.
Kompatibilitetssupport
For bagudkompatibilitet er parenteserne valgfri i SELECT-sætninger, hvis udtrykket er en heltalskonst myre. Vi anbefaler, at du altid bruger parenteser til TOP i SELECT-sætninger. Dette giver overensstemmelse med den krævede anvendelse i INSERT-, UPDATE-, MERGE- og SLET-sætninger.
Interoperabilitet
TOP-udtrykket påvirker ikke udsagn, der muligvis kører på grund af en trigger. De indsatte og slettede tabeller i udløserne returnerer kun de rækker, der virkelig påvirkes af INSERT-, UPDATE-, MERGE- eller DELETE-sætningerne. For eksempel, hvis en INSERT TRIGGER udløses som et resultat af en INSERT-sætning, der brugte en TOP-klausul.
SQL Server muliggør opdatering af rækker gennem visninger. Fordi du kan inkludere TOP-klausulen i visningsdefinitionen, kan visse rækker forsvinde fra visningen, hvis rækkerne ikke længere opfylder kravene i TOP-udtrykket på grund af en opdatering .
Når det er specificeret i MERGE-sætningen, gælder TOP-klausulen, efter at hele kildetabellen er samlet, og hele måltabellen er sammenføjet. Og de sammenføjede rækker, der ikke kvalificerer sig til en indsættelse, opdatering eller sletning handling fjernes. TOP-klausulen reducerer yderligere antallet af sammenføjede rækker til den angivne værdi, og indsæt, opdater eller slet-handlinger gælder for de resterende sammenføjede rækker på en ikke-ordnet måde. Det vil sige, der er ingen rækkefølge, hvor rækkerne fordeles mellem de handlinger, der er defineret i WHEN-klausulerne.For eksempel, hvis angivelse af TOP (10) påvirker 10 rækker, af disse rækker kan syv opdateres og tre indsættes. Eller en kan slettes, fem opdateres og fire indsættes osv. Fordi MERGE-sætningen udfører en fuldstændig tabel-scanning af både kilde- og måltabellerne, kan I / O-ydeevnen påvirkes, når du bruger TOP-klausulen til at ændre en stor tabel ved at oprette flere batcher. I dette scenarie er det vigtigt at sikre, at alle på hinanden følgende batcher er målrettet mod nye rækker.
Vær forsigtig, når du angiver TOP-klausulen i en forespørgsel, der indeholder en UNION, UNION ALL, UNDTAG eller INTERSECT operatør. Det er muligt at skrive en forespørgsel, der returnerer uventede resultater, fordi rækkefølgen, hvor TOP- og ORDER BY-klausulerne behandles logisk, ikke altid er intuitiv, når disse operatorer bruges i en valgt operation. Antag for eksempel, givet nedenstående tabel og data, at du vil returnere den billigste røde bil og den billigste blå bil. Det vil sige den røde sedan og den blå varevogn.
For at opnå disse resultater kan du skrive følgende forespørgsel.
Følgende er resultatsættet.
De uventede resultater returneres, fordi TOP-klausulen logisk kører før ORDER BY-klausulen, som sorterer operatørens resultater (UNION ALL i dette tilfælde). Så den forrige forespørgsel returnerer en rød bil og en hvilken som helst blå bil og bestiller derefter resultatet af denne union efter prisen. Følgende eksempel viser den korrekte metode til at skrive denne forespørgsel for at opnå det ønskede resultat.
Ved at bruge TOP og ORDER BY i en undervalgsoperation sikrer du, at resultaterne af ORDER BY-klausulen anvendes på TOP klausul og ikke til at sortere resultatet af UNION-operationen.
Her er resultatsættet.
Begrænsninger og begrænsninger
Når du bruger TOP med INSERT, UPDATE, MERGE eller SLET, er de refererede rækker ikke arrangeret i en hvilken som helst rækkefølge. Og du kan ikke angive ordren ORDER BY direkte i disse udsagn. Hvis du har brug for TOP til at indsætte, slette eller ændre rækker i en meningsfuld kronologisk rækkefølge, skal du bruge TOP med en ORDER BY-sætning, der er angivet i en undervalgserklæring. Se følgende eksempler i denne artikel.
Du kan ikke bruge TOP i en UPDATE og SLET sætninger på partitionerede visninger.
Du kan ikke kombinere TOP med OFFSET og FETCH i det samme forespørgselsudtryk (i samme forespørgselsomfang). For mere information, se ORDER BY-klausul (Transact-SQL).
Eksempler
Kategori | Fremhævede syntakselementer |
---|---|
Grundlæggende syntaks | TOP • PERCENT |
Inklusive båndværdier | MED BINDER |
Begrænsning af de rækker, der er påvirket af SLET, INDSÆT eller UPDATE | SLET • INDSÆT • OPDATER |
Grundlæggende syntaks
Eksempler i dette afsnit demonstrerer den grundlæggende funktionalitet i ORDER BY-klausulen ved hjælp af den mindst nødvendige syntaks.
EN. Brug af TOP med en konstant værdi
Følgende eksempler bruger en konstant værdi til at angive antallet af medarbejdere, der returneres i forespørgselsresultatsættet. I det første eksempel returneres de første 10 udefinerede rækker, fordi en ORDER BY-klausul ikke bruges. I det andet eksempel bruges en ORDER BY-klausul til at returnere de top 10 nyligt ansatte medarbejdere.
B. Brug af TOP med en variabel
Følgende eksempel bruger en variabel til at specificere antallet af medarbejdere, der returneres i forespørgselsresultatsættet.
C. Angivelse af en procentdel
Følgende eksempel bruger PERCENT til at specificere det antal medarbejdere, der returneres i forespørgselsresultatsættet. Der er 290 medarbejdere i tabellen HumanResources.Employee
. Da fem procent af 290 er en brøkværdi, afrundes værdien til det næste heltal.
Inkluderet bindingsværdier
A. Brug WITH TIES til at inkludere rækker, der matcher værdierne i den sidste række
Følgende eksempel får den øverste 10
procent af alle medarbejdere med den højeste løn a nd returnerer dem i faldende rækkefølge i henhold til deres løn. Angivelse af WITH TIES
sikrer, at medarbejdere med løn svarende til den laveste returnerede løn (sidste række) også er inkluderet i resultatsættet, selvom det overstiger 10
procent af medarbejderne.
Begrænsning af de rækker, der er påvirket af SLET, INDSÆT eller OPDATERING
A. Brug af TOP til at begrænse antallet af slettede rækker
Når du bruger en TOP (n) -klausul med SLET, udføres sletningen på et udefineret valg af n antal rækker. Det vil sige, DELETE-sætningen vælger et hvilket som helst (n) antal rækker, der opfylder kriterierne defineret i WHERE-klausulen.Følgende eksempel sletter 20
rækker fra PurchaseOrderDetail
-tabellen, der har forfaldsdatoer tidligere end 1. juli 2002.
Hvis du vil bruge TOP til at slette rækker i en meningsfuld kronologisk rækkefølge, skal du bruge TOP med ORDER BY i en undervalgserklæring. Den følgende forespørgsel sletter de 10 rækker i PurchaseOrderDetail
-tabellen, der har de tidligste forfaldsdatoer. For at sikre, at kun 10 rækker slettes, er den kolonne, der er specificeret i underudvalgssætningen (PurchaseOrderID
) den primære nøgle i tabellen. Brug af en ikke-nøglekolonne i underudvalgssætningen kan resultere i sletning af mere end 10 rækker, hvis den angivne kolonne indeholder duplikatværdier.
B. Brug af TOP til at begrænse antallet af indsatte rækker
Følgende eksempel opretter tabellen EmployeeSales
og indsætter navn og år-til-dato salgsdata for de fem bedste medarbejdere fra tabellen HumanResources.Employee
. INSERT-sætningen vælger fem rækker, der returneres af SELECT
-erklæringen, der opfylder kriterierne defineret i WHERE-klausulen. OUTPUT-klausulen viser de rækker, der er indsat i EmployeeSales
-tabellen. Bemærk, at ORDER BY-klausulen i SELECT-sætningen ikke bruges til at bestemme de fem øverste medarbejdere.
Hvis du vil bruge TOP til at indsætte rækker i en meningsfuld kronologisk rækkefølge, skal du bruge TOP med ORDER BY i en udsendelse af undervalg. Følgende eksempel viser, hvordan man gør dette. OUTPUT-klausulen viser de rækker, der er indsat i EmployeeSales
-tabellen. Bemærk, at de fem øverste medarbejdere nu er indsat baseret på resultaterne af ORDER BY-klausulen i stedet for udefinerede rækker.
C. Brug TOP til at begrænse antallet af opdaterede rækker
Følgende eksempel bruger TOP-klausulen til at opdatere rækker i en tabel. Når du bruger en TOP (n) -klausul med UPDATE, kører opdateringsoperationen på et udefineret antal rækker. Det vil sige UPDATE-sætningen vælger et (n) antal rækker, der opfylder kriterierne defineret i WHERE-klausulen. Følgende eksempel tildeler 10 kunder fra en sælger til en anden.
Hvis du skal Brug TOP til at anvende opdateringer i en meningsfuld kronologi, du skal bruge TOP sammen med ORDER BY i en undervalgserklæring. Følgende eksempel opdaterer ferietimerne for de 10 medarbejdere med de tidligste ansættelsesdatoer.
Eksempler: Azure Synapse Analytics og Parallel Data Warehouse
Følgende eksempel returnerer de 31 øverste rækker, der matcher forespørgselskriterierne. ORDER BY-klausulen sikrer, at de 31 returnerede rækker er de første 31 rækker baseret på en alfabetisk rækkefølge af kolonnen LastName
.
Brug af TOP uden at angive bånd.
Resultat: 31 rækker returneres.
Brug TOP til at specificere WITH BINDER.
Resultat: 33 rækker returneres, fordi tre medarbejdere med navnet Brown tie til den 31. række.