ÖVERKANT (Transact-SQL)
gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric
Begränsar de rader som returneras i ett frågeresultat som anges till ett angivet antal rader eller procentandel rader i SQL Server. När du använder TOP
med ORDER BY
-satsen begränsas resultatuppsättningen till det första n antal ordnade rader. Annars returnerar TOP
det första n antal rader i en odefinierad ordning. Använd den här satsen för att ange antalet rader som returneras från en SELECT
-instruktion. Du kan också använda TOP
för att ange de rader som påverkas av en instruktion INSERT
, UPDATE
, MERGE
eller DELETE
.
Transact-SQL syntaxkonventioner
Syntax
Syntax för SQL Server och Azure SQL Database:
[
TOP (expression) [ PERCENT ]
[ WITH TIES ]
]
Syntax för Azure Synapse Analytics and Analytics Platform System (PDW):
[
TOP ( expression )
[ WITH TIES ]
]
Argument
uttryck
Det numeriska uttryck som anger antalet rader som ska returneras.
uttryck konverteras implicit till ett flyttal värde om du anger PERCENT
. Annars konverteras uttryck till bigint.
PROCENT
Anger att frågan endast returnerar det första uttrycket procent av raderna från resultatuppsättningen. Bråkvärden avrundas upp till nästa heltalsvärde.
MED BAND
Returnerar två eller flera rader som binder för sista plats i den begränsade resultatuppsättningen. Du måste använda det här argumentet med ORDER BY
-satsen.
WITH TIES
kan leda till att fler rader returneras än det värde som anges i uttryck. Om till exempel uttryck är inställt på 5
men ytterligare två rader matchar värdena för de ORDER BY
kolumnerna på rad 5 innehåller resultatuppsättningen sju rader.
Du kan bara ange TOP
-satsen med argumentet WITH TIES
i SELECT
-instruktioner och endast om du även anger ORDER BY
-satsen. Den returnerade ordningen för att binda poster är godtycklig.
ORDER BY
påverkar inte den här regeln.
Metodtips
I en SELECT
-instruktion använder du alltid en ORDER BY
-sats med TOP
-satsen. Det här är det enda sättet att förutsäga 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 frågeväxlingslösning. En växlingslösning (d.v.s. att skicka segment eller sidor data till klienten) är enklare att implementera med hjälp av OFFSET
- och FETCH
-satser. Mer information finns i SELECT – ORDER BY-satsen.
Använd TOP
(eller OFFSET
och FETCH
) i stället för SET ROWCOUNT
för att begränsa antalet rader som returneras. Dessa metoder föredras framför användning av SET ROWCOUNT
av följande skäl:
- Som en del av en
SELECT
-instruktion kan frågeoptimeraren överväga värdet för uttryck i satsernaTOP
ellerFETCH
under frågeoptimeringen. Eftersom du använderSET ROWCOUNT
utanför en instruktion som kör en fråga kan dess värde inte beaktas i en frågeplan.
Stöd för kompatibilitet
För bakåtkompatibilitet är parenteserna valfria i SELECT
-instruktioner om uttrycket är en heltalskonstant. Vi rekommenderar att du alltid använder parenteser för TOP
i SELECT
-instruktioner. Detta ger konsekvens med den nödvändiga användningen i INSERT
, UPDATE
, MERGE
och DELETE
-instruktioner.
Samverkan
Uttrycket TOP
påverkar inte instruktioner som kan köras på grund av en utlösare. Tabellerna inserted
och deleted
i utlösarna returnerar endast de rader som verkligen påverkas av instruktionen INSERT
, UPDATE
, MERGE
eller DELETE
. Om till exempel en INSERT TRIGGER
utlöses till följd av en INSERT
-instruktion som använde en TOP
-sats.
SQL Server gör det möjligt att uppdatera rader via vyer. Eftersom du kan inkludera TOP
-satsen i vydefinitionen kan vissa rader försvinna från vyn om raderna inte längre uppfyller kraven för TOP
-uttrycket på grund av en uppdatering.
När den anges i MERGE
-instruktionen gäller TOP
-satsen efter att hela källtabellen och hela måltabellen har anslutits. Och de kopplade raderna som inte kvalificerar sig för en infognings-, uppdaterings- eller borttagningsåtgärd tas bort. Satsen TOP
minskar ytterligare antalet kopplade rader till det angivna värdet och åtgärderna infoga, uppdatera eller ta bort gäller för de återstående kopplade raderna på ett oordnat sätt. Det betyder att det inte finns någon ordning i vilken raderna distribueras mellan de åtgärder som definieras i WHEN
-satserna. Om du till exempel anger TOP (10)
påverkar 10 rader kan sju av dessa rader uppdateras och tre infogas. Eller så kan en tas bort, fem uppdateras och fyra infogas och så vidare. Eftersom MERGE
-instruktionen gör en fullständig tabellgenomsökning 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 batchar. I det här scenariot är det viktigt att se till att alla efterföljande batchar riktar in sig på nya rader.
Var försiktig när du anger TOP
-satsen i en fråga som innehåller operatorn UNION
, UNION ALL
, EXCEPT
eller INTERSECT
. Det går att skriva en fråga som returnerar oväntade resultat eftersom den ordning i vilken TOP
- och ORDER BY
-satser bearbetas logiskt inte alltid är intuitiv när dessa operatorer används i en select-åtgärd. Med tanke på följande tabell och data antar du till exempel att du vill returnera den billigaste röda bilen och den billigaste blå bilen. Den röda sedanen och den blå skåpbilen.
CREATE TABLE dbo.Cars
(
Model VARCHAR (15),
Price MONEY,
Color VARCHAR (10)
);
INSERT dbo.Cars
VALUES ('sedan', 10000, 'red'),
('convertible', 15000, 'blue'),
('coupe', 20000, 'red'),
('van', 8000, 'blue');
För att uppnå dessa resultat kan du skriva följande fråga.
SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
UNION ALL
SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC;
GO
Här är resultatuppsättningen.
Model Color Price
------------- ---------- -------
sedan red 10000.00
convertible blue 15000.00
Oväntade resultat returneras eftersom TOP
-satsen körs logiskt före ORDER BY
-satsen, vilket sorterar resultatet av operatorn (UNION ALL
i det här fallet). Så den föregående frågan returnerar en röd bil och en blå bil och beställer sedan resultatet av den unionen efter priset. I följande exempel visas rätt metod för att skriva den här frågan för att uppnå önskat resultat.
SELECT Model, Color, Price
FROM (SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
ORDER BY Price ASC) AS a
UNION ALL
SELECT Model, Color, Price
FROM (SELECT TOP (1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC) AS b;
GO
Genom att använda TOP
och ORDER BY
i en undermarkeringsåtgärd ser du till att resultatet av ORDER BY
-satsen tillämpas på TOP
-satsen och inte på att sortera resultatet av den UNION
åtgärden.
Här är resultatuppsättningen.
Model Color Price
------------- ---------- -------
sedan red 10000.00
van blue 8000.00
Begränsningar
När du använder TOP
med INSERT
, UPDATE
, MERGE
eller DELETE
ordnas inte de refererade raderna i någon ordning. Och du kan inte ange ORDER BY
-satsen direkt i dessa instruktioner. Om du behöver använda TOP
för att infoga, ta bort eller ändra rader i en meningsfull kronologisk ordning använder du TOP
med en ORDER BY
-sats som anges i en undermarkeringsinstruktion. Se avsnittet Exempel i den här artikeln.
Du kan inte använda TOP
i UPDATE
- eller DELETE
-instruktioner i partitionerade vyer.
Du kan inte kombinera TOP
med OFFSET
och FETCH
i samma frågeuttryck (i samma frågeomfång). Mer information finns i SELECT – ORDER BY-satsen.
Exempel
I Transact-SQL kodexempel i den här artikeln används AdventureWorks2022
- eller AdventureWorksDW2022
-exempeldatabasen, som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.
Kategori | Aktuella syntaxelement |
---|---|
Grundläggande syntax | TOP * PERCENT |
Inklusive kopplingsvärden | WITH TIES |
Begränsa de rader som påverkas av DELETE, INSERT eller UPDATE |
DELETE , INSERT , UPDATE |
Grundläggande syntax
Exempel i det här avsnittet visar de grundläggande funktionerna i ORDER BY
-satsen med hjälp av den minsta obligatoriska syntaxen.
A. Använd TOP med ett konstant värde
I följande exempel används ett konstant värde för att ange antalet anställda som returneras i frågeresultatuppsä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.
USE AdventureWorks2022;
GO
-- Select the first 10 random employees.
SELECT TOP (10) JobTitle, HireDate
FROM HumanResources.Employee;
GO
-- Select the first 10 employees hired most recently.
SELECT TOP (10) JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
B. Använd TOP med en variabel
I följande exempel används en variabel för att ange antalet anställda som returneras i frågeresultatuppsättningen.
USE AdventureWorks2022;
GO
DECLARE @p AS INT = 10;
SELECT TOP (@p) JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO
C. Ange en procentsats
I följande exempel används PERCENT
för att ange antalet anställda som returneras i frågeresultatuppsättningen. Det finns 290 anställda i tabellen HumanResources.Employee
. Eftersom fem procent av 290 är ett bråkvärde avrundas värdet upp till nästa heltal.
USE AdventureWorks2022;
GO
SELECT TOP (5) PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
Inkludera oavgjorda värden
A. Använd WITH TIES för att inkludera rader som matchar värdena på den sista raden
I följande exempel får du den högsta 10
procent av alla anställda med högst lön och returnerar dem i fallande ordning enligt deras lön. Om du anger WITH TIES
ser du till att anställda med löner som motsvarar den lägsta lönen som returneras (den sista raden) också inkluderas i resultatuppsättningen, även om den överskrider 10
procent av de anställda.
USE AdventureWorks2022;
GO
SELECT TOP (10) PERCENT WITH TIES pp.FirstName,
pp.LastName,
e.JobTitle,
e.Gender,
r.Rate
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;
GO
Begränsa de rader som påverkas av DELETE, INSERT eller UPDATE
A. Använd TOP för att begränsa antalet borttagna rader
När du använder en TOP (<n>)
-sats med DELETE
utförs borttagningsåtgärden på en odefinierad markering av n antal rader. Det vill DELETE
-instruktionen väljer ett (n) antal rader som uppfyller kriterierna som definierats i WHERE
-satsen. I följande exempel tas 20
rader bort från tabellen PurchaseOrderDetail
som har förfallodatum tidigare än den 1 juli 2002.
USE AdventureWorks2022;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Om du vill använda TOP
för att ta bort rader i en meningsfull kronologisk ordning använder du TOP
med ORDER BY
i en undermarkeringssats. Följande fråga tar bort de 10 raderna i tabellen PurchaseOrderDetail
som har de tidigaste förfallodatumen. För att säkerställa att endast 10 rader tas bort är kolumnen som anges i instruktionen subselect (PurchaseOrderID
) den primära nyckeln i tabellen. Om du använder en icke-nyckelkolumn i undermarkeringssatsen kan fler än 10 rader tas bort om den angivna kolumnen innehåller duplicerade värden.
USE AdventureWorks2022;
GO
DELETE Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN (
SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC
);
GO
B. Använd TOP för att begränsa antalet infogade rader
I följande exempel skapas tabellen EmployeeSales
och infogar namn och försäljningsdata hittills i år för de fem främsta anställda i tabellen HumanResources.Employee
. Instruktionen INSERT
väljer fem rader som returneras av SELECT
-instruktionen som uppfyller kriterierna som definierats i WHERE
-satsen. Satsen OUTPUT
visar de rader som infogas i tabellen EmployeeSales
.
ORDER BY
-satsen i SELECT
-instruktionen används inte för att fastställa de fem främsta anställda.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
(
EmployeeID NVARCHAR (11) NOT NULL,
LastName NVARCHAR (20) NOT NULL,
FirstName NVARCHAR (20) NOT NULL,
YearlySales MONEY NOT NULL
);
GO
INSERT TOP (5) INTO dbo.EmployeeSales
OUTPUT
inserted.EmployeeID,
inserted.FirstName,
inserted.LastName,
inserted.YearlySales
SELECT sp.BusinessEntityID,
c.LastName,
c.FirstName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO
Om du vill använda TOP
för att infoga rader i en meningsfull kronologisk ordning använder du TOP
med ORDER BY
i en undermarkeringssats. I följande exempel visas hur du gör detta. Satsen OUTPUT
visar de rader som infogas i tabellen EmployeeSales
. De fem främsta anställda infogas nu baserat på resultatet av ORDER BY
-satsen i stället för odefinierade rader.
INSERT INTO dbo.EmployeeSales
OUTPUT
inserted.EmployeeID,
inserted.FirstName,
inserted.LastName,
inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID,
c.LastName,
c.FirstName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO
C. Använd TOP för att begränsa antalet rader som har uppdaterats
I följande exempel används TOP
-satsen för att uppdatera rader i en tabell. När du använder en TOP (<n>)
-sats med UPDATE
körs uppdateringsåtgärden på ett odefinierat antal rader. Det vill UPDATE
-instruktionen väljer ett (n) antal rader som uppfyller kriterierna som definierats i WHERE
-satsen. I följande exempel tilldelas 10 kunder från en säljare till en annan.
USE AdventureWorks2022;
UPDATE TOP (10)
Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
Om du måste använda TOP
för att tillämpa uppdateringar i en meningsfull kronologi måste du använda TOP
tillsammans med ORDER BY
i en undermarkeringsinstruktör. I följande exempel uppdateras semestertimmarna för de 10 anställda med de tidigaste anställningsdatumen.
UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID
FROM HumanResources.Employee
ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
I följande exempel returneras de 31 översta raderna som matchar frågevillkoren. Satsen ORDER BY
ser till att de 31 returnerade raderna är de första 31 raderna baserat på en alfabetisk ordning i kolumnen LastName
.
Använda TOP
utan att ange band.
SELECT TOP (31) FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Resultat: 31 rader returneras.
Använd TOP
och ange WITH TIES
.
SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Resultat: 33 rader returneras eftersom tre anställda med namnet Brown
slips för den 31:a raden.