TOPP (Transact-SQL)

  • 16.03.2017
  • 11 minutter å lese
    • V
    • M
    • r
    • c
    • d
    • +12

Gjelder: SQL Server (alle støttede versjoner) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallell datalager

Begrenser radene som returneres i et søkeresultat satt til et spesifisert antall rader eller prosentandel av rader i SQL Server. Når du bruker TOPP med ORDER BY-leddet, er resultatsettet begrenset til det første N antallet bestilte rader. Ellers returnerer TOP det første N antall rader i udefinert rekkefølge. Bruk denne paragrafen til å spesifisere antall rader som returneres fra en SELECT-setning. Eller bruk TOPP for å spesifisere radene som er berørt av en INSERT-, UPDATE-, MERGE- eller DELETE-setning.

Transact-SQL-syntakskonvensjoner

Syntaks

Følgende er syntaksen for SQL Server og Azure SQL Database:

Følgende er syntaks for Azure Synapse Analytics og Parallel Datalager:

Merk

For å se Transact-SQL syntaks for SQL Server 2014 og tidligere, se dokumentasjon for tidligere versjoner .

Argumenter

uttrykk
Det numeriske uttrykket som angir antall rader som skal returneres. uttrykk konverteres implisitt til en flytverdi hvis du spesifiserer PERCENT. Ellers blir uttrykk konvertert til bigint.

PERCENT
Indikerer at spørringen bare returnerer den første uttrykksprosenten av rader fra resultatsettet. Brøkverdier avrundes opp til neste heltalsverdi.

MED BINDER> Returnerer to eller flere rader som knytter seg til siste plass i det begrensede resultatsettet. Du må bruke dette argumentet med ORDER BY-setningen. WITH TIES kan føre til at flere rader returneres enn verdien som er angitt i uttrykket. Hvis for eksempel uttrykk er satt til 5, men to ekstra rader samsvarer med verdiene til ORDER BY-kolonnene i rad 5, vil resultatsettet inneholde syv rader.

Du kan spesifisere TOP-setningen med WITH TIES argument bare i SELECT-setninger, og bare hvis du «også har spesifisert ORDER BY-klausulen. Den returnerte rekkefølgen på bindingsposter er vilkårlig. ORDER BY påvirker ikke denne regelen.

I en SELECT-setning, bruk alltid en ORDER BY-ledd med TOP-setningen. Fordi det er den eneste måten å forutsigbart indikere hvilke rader som er berørt av TOP.

Bruk OFFSET og FETCH i ORDER BY-setningen i stedet for TOP-setningen for å implementere en søkesøksløsning. En personsøkeløsning ( det er lettere å implementere biter eller «sider» med data til klienten) ved å bruke OFFSET- og FETCH-klausuler. For mer informasjon, se ORDER BY-klausul (Transact-SQL).

Bruk TOP (eller OFFSET og FETCH) i stedet for SET ROWCOUNT for å begrense antallet returnerte rader. Disse metodene foretrekkes fremfor å bruke SET ROWCOUNT av følgende grunner:

  • Som en del av en SELECT-setning, er spørringsoptimalisereren kan vurdere verdien av uttrykk i TOPP- eller FETCH-leddene under optimalisering av spørringen. Fordi du bruker SET ROWCOUNT utenfor en setning som kjører et spørsmål, kan verdien ikke betraktes i en spørringsplan.

Kompatibilitetsstøtte

For bakoverkompatibilitet er parenteser valgfrie i SELECT-setninger hvis uttrykket er et helt tall maur. Vi anbefaler at du alltid bruker parenteser for TOPP i SELECT-setninger. Dette gir konsistens med den nødvendige bruken i INSERT-, UPDATE-, MERGE- og SLETTE-setninger.

Interoperabilitet

TOP-uttrykket påvirker ikke utsagn som kan kjøre på grunn av en utløser. De innsatte og slettede tabellene i utløserne returnerer bare radene som virkelig påvirkes av INSERT-, UPDATE-, MERGE- eller DELETE-setningene. For eksempel hvis en INSERT TRIGGER utløses som et resultat av en INSERT-setning som brukte en TOP-setning. / p>

SQL Server tillater oppdatering av rader gjennom visninger. Fordi du kan inkludere TOP-setningen i visningsdefinisjonen, kan visse rader forsvinne fra visningen hvis radene ikke lenger oppfyller kravene til TOP-uttrykket på grunn av en oppdatering .

Når det er spesifisert i MERGE-setningen, gjelder TOP-klausulen etter at hele kildetabellen og hele måltabellen er slått sammen. Og de sammenføyde radene som ikke kvalifiserer for innsetting, oppdatering eller sletting handling fjernes. TOP-leddet reduserer antall sammenføyde rader til den angitte verdien ytterligere, og innsettings-, oppdaterings- eller slettingshandlingene gjelder for de gjenværende sammenføyde radene på en ikke-ordnet måte. Det vil si at det ikke er noen rekkefølge der radene fordeles mellom handlingene som er definert i WHEN-leddene.For eksempel, hvis spesifisering av TOPP (10) påvirker 10 rader, av disse radene, kan sju oppdateres og tre settes inn. Eller en kan slettes, fem oppdateres og fire settes inn, og så videre. Fordi MERGE-setningen utfører en fullstendig tabellskanning av både kilde- og måltabellene, kan I / O-ytelsen påvirkes når du bruker TOP-setningen til å endre en stor tabell ved å opprette flere batcher. I dette scenariet er det viktig å sikre at alle påfølgende grupper retter seg mot nye rader.

Vær forsiktig når du spesifiserer TOP-setningen i et spørsmål som inneholder UNION, UNION ALL, UNNTATT eller INTERSECT operatør. Det er mulig å skrive et spørsmål som gir uventede resultater fordi rekkefølgen TOP- og ORDER BY-leddene behandles logisk ikke alltid er intuitiv når disse operatorene brukes i en valgt operasjon. For eksempel, gitt følgende tabell og data, antar du at du vil returnere den billigste røde bilen og den minst kostbare blå bilen. Det vil si den røde sedanen og den blå varebilen.

For å oppnå disse resultatene kan du skrive følgende spørsmål.

Følgende er resultatsettet.

De uventede resultatene returneres fordi TOP-setningen logisk kjører før ORDER BY-setningen, som sorterer resultatene til operatøren (UNION ALL i dette tilfellet). Så, den forrige spørringen returnerer en rød bil og en hvilken som helst blå bil, og bestiller deretter resultatet av den fagforeningen med prisen. Følgende eksempel viser den riktige metoden for å skrive dette spørsmålet for å oppnå ønsket resultat.

Ved å bruke TOPP og ORDRE BY i en undervalgoperasjon, sørger du for at resultatene av ORDRE BY-leddet brukes på TOP klausul og ikke å sortere resultatet av UNION-operasjonen.

Her er resultatsettet.

Begrensninger og begrensninger

Når du bruker TOPP med INSERT, UPDATE, MERGE eller SLETT, er de refererte radene ikke ordnet i hvilken som helst rekkefølge. Og du kan ikke spesifisere ORDER BY-setningen i disse utsagnene. Hvis du trenger å bruke TOP for å sette inn, slette eller endre rader i en meningsfylt kronologisk rekkefølge, kan du bruke TOP med en ORDER BY-setning spesifisert i en undervalgssetning. Se følgende eksempler i denne artikkelen.

Du kan ikke bruke TOPP i en OPPDATERING og SLETTE uttalelser på partisjonerte visninger.

Du kan ikke kombinere TOPP med FORSKJELLING og FETCH i det samme spørreuttrykket (i samme spørringsomfang). For mer informasjon, se ORDER BY Clause (Transact-SQL).

Eksempler

Kategori Fremhævede syntakselementer
Grunnleggende syntaks TOPP • PROSENT
Inkludert bindingsverdier MED BUNN
Begrensning av radene som påvirkes av SLETT, INSERT eller OPPDATERING SLETT • INSERT • OPPDATERING

Grunnleggende syntaks

Eksempler i denne delen viser den grunnleggende funksjonaliteten til ORDER BY-setningen ved bruk av minimum syntaks.

EN. Bruke TOP med en konstant verdi

Følgende eksempler bruker en konstant verdi for å spesifisere antall ansatte som returneres i spørresultatsettet. I det første eksemplet returneres de første 10 udefinerte radene fordi en ORDER BY-klausul ikke brukes. I det andre eksemplet brukes en ORDER BY-klausul til å returnere topp 10 nylig ansatte ansatte.

B. Bruke TOP med en variabel

Følgende eksempel bruker en variabel til å spesifisere antall ansatte som returneres i spørresultatsettet.

C. Spesifisere en prosentandel

Følgende eksempel bruker PERCENT for å spesifisere antall ansatte som returneres i spørringsresultatsettet. Det er 290 ansatte i HumanResources.Employee -tabellen. Fordi fem prosent av 290 er en brøkdel, avrundes verdien opp til neste hele tall.

Inkludert bindingsverdier

A. Bruker WITH TIES for å inkludere rader som samsvarer med verdiene i siste rad

Følgende eksempel får toppen 10 prosent av alle ansatte med høyest lønn a nd returnerer dem i fallende rekkefølge etter lønn. Å spesifisere WITH TIES sikrer at ansatte med lønn lik den laveste returnerte lønnen (siste rad) også er inkludert i resultatsettet, selv om det overstiger 10 prosent av ansatte.

Begrensning av radene som er berørt av SLETT, INSERT eller OPPDATERING

A. Bruk TOP for å begrense antall slettede rader

Når du bruker en TOP (n) -klausul med SLETT, utføres slettingen på et udefinert utvalg av n antall rader. Det vil si at DELETE-setningen velger hvilket som helst (n) antall rader som oppfyller kriteriene definert i WHERE-setningen.Følgende eksempel sletter 20 rader fra PurchaseOrderDetail -tabellen som har forfallsdatoer tidligere enn 1. juli 2002.

Hvis du vil bruke TOP for å slette rader i en meningsfull kronologisk rekkefølge, kan du bruke TOPP med ORDER BY i en undervalgssetning. Følgende spørsmål sletter de 10 radene i PurchaseOrderDetail -tabellen som har de tidligste forfallsdatoene. For å sikre at bare 10 rader blir slettet, er kolonnen som er spesifisert i subselect-setningen (PurchaseOrderID) den viktigste nøkkelen til tabellen. Hvis du bruker en ikke-nøkkelkolonne i subselect-setningen, kan det føre til sletting av mer enn 10 rader hvis den spesifiserte kolonnen inneholder dupliserte verdier.

B. Bruk TOP for å begrense antall rader som er satt inn

Følgende eksempel oppretter tabellen EmployeeSales og setter inn navn og år-til-dato salgsdata for de fem beste ansatte fra tabellen HumanResources.Employee. INSERT-setningen velger hvilke som helst fem rader som returneres av SELECT utsagnet som oppfyller kriteriene definert i WHERE-setningen. OUTPUT-setningen viser radene som settes inn i EmployeeSales -tabellen. Legg merke til at ORDER BY-setningen i SELECT-setningen ikke brukes til å bestemme de fem beste ansatte.

Hvis du vil bruke TOP for å sette inn rader i en meningsfylt kronologisk rekkefølge, bruk TOPP med ORDER BY i en utsnitt fra undervalg. Følgende eksempel viser hvordan du gjør dette. OUTPUT-setningen viser radene som er satt inn i EmployeeSales -tabellen. Legg merke til at de fem beste ansatte nå er satt inn basert på resultatene av ORDER BY-setningen i stedet for udefinerte rader.

C. Bruk TOP for å begrense antall oppdaterte rader

Følgende eksempel bruker TOP-klausulen for å oppdatere rader i en tabell. Når du bruker en TOP (n) -klausul med UPDATE, kjører oppdateringsoperasjonen på et udefinert antall rader. Det vil si at UPDATE-setningen velger hvilket som helst (n) antall rader som møter kriteriene som er definert i WHERE-paragrafen. Følgende eksempel tildeler 10 kunder fra en selger til en annen.

Hvis du må bruk TOP for å bruke oppdateringer i en meningsfull kronologi, du må bruke TOP sammen med ORDER BY i en undervalgssetning. Følgende eksempel oppdaterer ferietimene til de 10 ansatte med de tidligste ansettelsesdatoene.

Eksempler: Azure Synapse Analytics og Parallel Data Warehouse

Følgende eksempel returnerer de 31 øverste radene som samsvarer med søkekriteriene. ORDER BY-leddet sørger for at de 31 returnerte radene er de første 31 radene basert på en alfabetisk rekkefølge av LastName -kolonnen.

Bruk av TOP uten å spesifisere bånd.

Resultat: 31 rader returneres.

Bruk TOP, spesifiser MED BINNER.

Resultat: 33 rader returneres, fordi tre ansatte kalt Brown tie for 31. rad.

Se også

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *