Dela via


Ö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, MERGEeller 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 satserna TOP eller FETCH under frågeoptimeringen. Eftersom du använder SET 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, MERGEoch 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, MERGEeller 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, EXCEPTeller 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, MERGEeller DELETEordnas 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 DELETEutfö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 UPDATEkö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 TOPoch 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.