TOPP (Transact-SQL) (Svenska)

  • 2016-03-03
  • 11 minuter att läsa
    • V
    • M
    • r
    • c
    • d
    • +12

Gäller för: SQL Server (alla versioner som stöds) Azure SQL-databas Azure SQL-hanterad instans Azure Synapse Analytics Parallellt datalager

Begränsar raderna som returneras i ett frågeresultat till ett angivet antal rader eller procentandel av rader i SQL Server. När du använder TOP med ORDER BY-satsen är resultatuppsättningen begränsad till det första N-antalet ordnade rader. I annat fall returnerar TOP det första N-antalet rader i odefinierad ordning. Använd denna klausul för att ange antalet rader som returneras från ett SELECT-uttalande. Eller använd TOPP för att ange de rader som påverkas av ett INSERT-, UPDATE-, MERGE- eller DELETE-uttalande.

Transact-SQL-syntaxkonventioner

Syntax

Följande är syntax för SQL Server och Azure SQL Database:

Följande är syntax för Azure Synapse Analytics och Parallel Datalager:

Obs

Om du vill visa Transact-SQL-syntax för SQL Server 2014 och tidigare, se dokumentationen för tidigare versioner .

Argument

uttryck
Det numeriska uttrycket som anger antalet rader som ska returneras. uttryck omvandlas implicit till ett flytvärde om du anger PERCENT. Annars konverteras uttryck till bigint.

PERCENT
Indikerar att frågan endast returnerar den första uttrycksprocenten av rader från resultatuppsättningen. Bråkvärden avrundas upp till nästa heltalsvärde.

MED TIES
Returnerar två eller flera rader som slår till sista plats i den begränsade resultatuppsättningen. Du måste använda detta argument med ORDER BY-klausulen. WITH TIES kan leda till att flera rader returneras än det värde som anges i uttrycket. Om exempelvis uttrycket är satt till 5 men ytterligare två rader matchar värdena för ORDER BY-kolumnerna i rad 5, kommer resultatuppsättningen att innehålla sju rader.

Du kan ange TOP-satsen med WITH TIES argument bara i SELECT-uttalanden, och bara om du ”också har angett ORDER BY-klausulen. Den returnerade ordningen för kopplingsposter är godtycklig. ORDER BY påverkar inte denna regel.

Bästa praxis

I ett SELECT-uttalande, använd alltid en ORDER BY-sats med TOP-satsen. Eftersom det är det enda sättet att förutsägbart ange vilka rader som påverkas av TOP.

Använd OFFSET och FETCH i ORDER BY-satsen i stället för TOP-satsen för att implementera en sökningslösning. En personsökarlösning ( att skicka bitar eller ”sidor” med data till klienten) är lättare att implementera med OFFSET- och FETCH-klausuler. För mer information, se ORDER BY Clause (Transact-SQL).

Använd TOP (eller OFFSET och FETCH) istället för SET ROWCOUNT för att begränsa antalet returnerade rader. Dessa metoder är att föredra framför SET ROWCOUNT av följande skäl:

  • Som en del av ett SELECT-uttalande är frågan optimizer kan ta hänsyn till uttrycksvärdet i TOP- eller FETCH-satserna under optimering av frågan. Eftersom du använder SET ROWCOUNT utanför ett uttalande som kör en fråga kan dess värde inte beaktas i en frågeplan.

Kompatibilitetsstöd

För bakåtkompatibilitet är parenteserna valfria i SELECT-satser om uttrycket är ett heltalskonst myra. Vi rekommenderar att du alltid använder parenteser för TOP i SELECT-uttalanden. Om du gör det överensstämmer det med den nödvändiga användningen i INSERT-, UPDATE-, MERGE- och DELETE-uttalanden.

Interoperabilitet

TOP-uttrycket påverkar inte påståenden som kan köras på grund av en utlösare. De infogade och borttagna tabellerna i utlösarna returnerar endast de rader som verkligen påverkas av INSERT-, UPDATE-, MERGE- eller DELETE-uttalanden. Till exempel om en INSERT TRIGGER utlöses som ett resultat av ett INSERT-uttalande som använde en TOP-sats.

SQL Server möjliggör uppdatering av rader genom vyer. Eftersom du kan inkludera TOP-paragrafen i visningsdefinitionen kan vissa rader försvinna från vyn om raderna inte längre uppfyller kraven i TOP-uttrycket på grund av en uppdatering .

När det anges i MERGE-satsen gäller TOP-klausulen efter att hela källtabellen och hela måltabellen är sammanfogade. Och de sammanfogade raderna som inte kvalificerar för en infogning, uppdatering eller radering åtgärden tas bort. TOP-klausulen minskar ytterligare antalet sammanfogade rader till det angivna värdet och insättnings-, uppdaterings- eller raderingsåtgärderna gäller för de återstående sammanfogade raderna på ett oordnat sätt. Det vill säga, det finns ingen ordning i vilken raderna fördelas mellan de åtgärder som definieras i WHEN-satserna.Till exempel, om du anger TOP (10) påverkar 10 rader, av dessa rader kan sju uppdateras och tre infogas. Eller så kan en tas bort, fem uppdateras och fyra infogas, och så vidare. Eftersom MERGE-satsen gör en fullständig tabellskanning av både käll- och måltabellerna kan I / O-prestanda påverkas när du använder TOP-satsen för att ändra en stor tabell genom att skapa flera satser. I det här scenariot är det viktigt att se till att alla på varandra följande satser riktar sig mot nya rader.

Var försiktig när du anger TOP-satsen i en fråga som innehåller en UNION, UNION ALL, EXCEPT eller INTERSECT operatör. Det är möjligt att skriva en fråga som returnerar oväntade resultat eftersom ordningen i vilka TOP- och ORDER BY-klausulerna behandlas logiskt inte alltid är intuitiv när dessa operatörer används i en vald operation. Antag till exempel med följande tabell och data att du vill returnera den billigaste röda bilen och den billigaste blå bilen. Det vill säga den röda sedan och den blå skåpbilen.

För att uppnå dessa resultat kan du skriva följande fråga.

Följande är resultatuppsättningen.

De oväntade resultaten returneras eftersom TOP-satsen logiskt körs före ORDER BY-satsen, som sorterar operatörens resultat (UNION ALL i detta fall). Så, den tidigare frågan returnerar en röd bil och en blå bil och beställer sedan resultatet av den facket med priset. Följande exempel visar den korrekta metoden för att skriva den här frågan för att uppnå önskat resultat.

Genom att använda TOP och ORDER BY i en undervalsoperation ser du till att resultaten av ORDER BY-klausulen tillämpas på TOP klausul och inte att sortera resultatet av UNION-operationen.

Här är resultatuppsättningen.

Begränsningar och begränsningar

När du använder TOP med INSERT, UPDATE, MERGE eller DELETE är de refererade raderna inte ordnade i valfri ordning. Och du kan inte ange ordningen ORDER BY direkt i dessa uttalanden. Om du behöver använda TOP för att infoga, radera eller modifiera rader i en meningsfull kronologisk ordning, använd TOP med en ORDER BY-sats som anges i ett undervalssats. Se följande exempelavsnitt i den här artikeln.

Du kan inte använda TOP i en UPPDATERING och RADERA på partitionerade vyer.

Du kan inte kombinera TOP med OFFSET och FETCH i samma frågeuttryck (i samma frågeomfång). För mer information, se ORDER BY Clause (Transact-SQL).

Exempel

Kategori Syntaxelement
Grundläggande syntax TOP • PERCENT
Inklusive bindningsvärden MED BAND
Begränsning av raderna som påverkas av DELETE, INSERT eller UPDATE DELETE • INSERT • UPDATE

Grundläggande syntax

Exempel i det här avsnittet visar grundläggande funktionalitet i ORDER BY-klausulen med minimikrav på syntax.

A. Använda TOP med ett konstant värde

Följande exempel använder ett konstant värde för att ange antalet anställda som returneras i sökresultatuppsättningen. I det första exemplet returneras de första 10 odefinierade raderna eftersom en ORDER BY-sats inte används. I det andra exemplet används en ORDER BY-sats för att returnera de 10 senaste anställda.

B. Använda TOP med en variabel

Följande exempel använder en variabel för att ange antalet anställda som returneras i frågeresultatuppsättningen.

C. Ange en procentsats

Följande exempel använder PERCENT för att ange antalet anställda som returneras i sökresultatuppsättningen. Det finns 290 anställda i tabellen HumanResources.Employee. Eftersom fem procent av 290 är ett bråkvärde avrundas värdet till nästa heltal.

Inkluderar slipsvärden

A. Användning MED TIES för att inkludera rader som matchar värdena i sista raden

Följande exempel får toppen 10 procent av alla anställda med högsta lön a nd returnerar dem i fallande ordning enligt deras lön. Att specificera WITH TIES säkerställer att anställda med löner som är lika med den lägsta returnerade lönen (sista raden) ingår i resultatuppsättningen, även om den överstiger 10

Begränsning av de rader som påverkas av DELETE, INSERT eller UPDATE

A. Använda TOP för att begränsa antalet raderade rader

När du använder en TOP (n) -sats med DELETE, görs raderingen på ett odefinierat urval av n antal rader. Det vill säga, DELETE-satsen väljer ett (n) antal rader som uppfyller kriterierna som definieras i WHERE-satsen.I följande exempel raderas 20 rader från PurchaseOrderDetail -tabellen som har förfallodatum tidigare än 1 juli 2002.

Om du vill använda TOP för att radera rader i en meningsfull kronologisk ordning, använd TOPP med ORDER BY i ett undervalssats. Följande fråga tar bort de 10 raderna i PurchaseOrderDetail -tabellen som har de tidigaste förfallodagen. För att säkerställa att endast tio rader raderas är den kolumn som anges i undervalssatsen (PurchaseOrderID) den primära nyckeln i tabellen. Att använda en icke-nyckelkolumn i undervalssatsen kan leda till att mer än tio rader tas bort om den angivna kolumnen innehåller dubbla värden.

B. Använda TOP för att begränsa antalet infogade rader

I följande exempel skapas tabellen EmployeeSales och infogar namn och år-till-dags försäljningsdata för de fem bästa anställda från tabellen HumanResources.Employee. INSERT-satsen väljer alla fem rader som returneras av SELECT -satsen som uppfyller kriterierna definierade i WHERE-satsen. OUTPUT-satsen visar raderna som är infogade i tabellen EmployeeSales. Lägg märke till att ORDER BY-klausulen i SELECT-uttalandet inte används för att bestämma de fem anställda.

Om du vill använda TOP för att infoga rader i en meningsfull kronologisk ordning, använd TOP med ORDER BY i en underval-uttalande. Följande exempel visar hur man gör detta. OUTPUT-klausulen visar raderna som är infogade i tabellen EmployeeSales. Observera att de fem bästa anställda nu är infogade baserat på resultaten i ORDER BY-satsen i stället för odefinierade rader.

C. Använd TOP för att begränsa antalet uppdaterade rader

Följande exempel använder TOP-satsen för att uppdatera rader i en tabell. När du använder en TOP (n) -sats med UPDATE körs uppdateringen på ett odefinierat antal rader. Det vill säga UPDATE-satsen väljer ett (n) antal rader som möter kriterierna som definieras i WHERE-klausulen. Följande exempel tilldelar tio kunder från en säljare till en annan.

Om du måste använd TOP för att tillämpa uppdateringar i en meningsfull kronologi, du måste använda TOP tillsammans med ORDER BY i ett underval. I följande exempel uppdateras semestertimmarna för de 10 anställda med de tidigaste anställningsdatumen.

Exempel: Azure Synapse Analytics och Parallel Data Warehouse

Följande exempel returnerar de 31 främsta raderna som matchar frågekriterierna. ORDER BY-klausulen säkerställer att de 31 returnerade raderna är de första 31 raderna baserat på en alfabetisk ordning av kolumnen LastName.

Användning av TOP utan att ange band.

Resultat: 31 rader returneras.

Med TOP, anger du MED BINDOR.

Resultat: 33 rader returneras, eftersom tre anställda som heter Brown slips för den 31: a raden.

Se även

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *