Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
A lekérdezési eredményben visszaadott sorokat az SQL Server megadott számú sorára vagy százalékára korlátozza. Ha TOP használ a ORDER BY záradékkal, az eredményhalmaz a rendezett sorok első n számára korlátozódik. Ellenkező esetben TOP az első n sorok számát adja vissza meghatározatlan sorrendben. Ezzel a záradékkal adhatja meg a SELECT utasításból visszaadott sorok számát. Vagy a TOP használatával megadhatja azokat a sorokat, amelyeket egy INSERT, UPDATE, MERGEvagy DELETE utasítás érint.
Transact-SQL szintaxis konvenciói
Syntax
Az SQL Server és az Azure SQL Database szintaxisa:
[
TOP (expression) [ PERCENT ]
[ WITH TIES ]
]
Az Azure Synapse Analytics and Analytics Platform System (PDW) szintaxisa:
[
TOP ( expression )
[ WITH TIES ]
]
Arguments
expression
A visszaadandó sorok számát meghatározó numerikus kifejezés.
kifejezés implicit módon konvertálódik lebegőpontos értékre, ha megadja PERCENT. Ellenkező esetben a kifejezésbigintlesz.
PERCENT
Azt jelzi, hogy a lekérdezés csak az első kifejezést adja vissza, az eredményhalmaz sorainak százalékát. Ha a sorok számított száma tört, akkor a következő egész számra lesz kerekítve.
KÖTELÉKEKKEL
Két vagy több olyan sort ad vissza, amelyek a korlátozott eredményhalmaz utolsó helyére kerülnek. Ezt az argumentumot a ORDER BY záradékkal kell használnia.
WITH TIES több sort adhat vissza, mint a kifejezés. Ha például kifejezés5 értékre van állítva, de az 5. sorban lévő ORDER BY oszlop értékeinek további két sora van, az eredményhalmaz hét sort tartalmaz.
A TOP záradékot a WITH TIES argumentummal csak SELECT utasításokban adhatja meg, és csak akkor, ha a ORDER BY záradékot is megadja. A rekordok visszaküldött sorrendje tetszőleges.
ORDER BY nincs hatással erre a szabályra.
Ajánlott eljárások
Egy SELECT utasításban mindig használjon ORDER BY záradékot a TOP záradékkal. Ez az egyetlen módja annak, hogy előre jelezze, mely sorokat érinti a TOP.
A OFFSET záradék helyett használjon FETCH és ORDER BY a TOP záradékban egy lekérdezésoldali megoldás implementálásához. A lapozómegoldások (vagyis adattömbök vagy oldalak az ügyfélnek való elküldése) egyszerűbben implementálhatók OFFSET és FETCH záradékok használatával. További információ: SELECT – ORDER BY záradék.
A visszaadott sorok számának korlátozásához TOP helyett OFFSET (vagy FETCH és SET ROWCOUNT) használjon. Ezeket a módszereket előnyben részesítik a SET ROWCOUNT használata során a következő okok miatt:
- Egy
SELECTutasítás részeként a lekérdezésoptimalizáló figyelembe veszi kifejezés értékét aTOPvagyFETCHzáradékokban a lekérdezésoptimalizálás során. Mivel egy lekérdezést futtató utasításon kívülSET ROWCOUNThasznál, annak értéke nem vehető figyelembe a lekérdezéstervben.
Kompatibilitási támogatás
A visszamenőleges kompatibilitás érdekében a zárójelek nem kötelezőek SELECT utasításokban, ha a kifejezés egész számállandó. Javasoljuk, hogy mindig zárójeleket használjon TOPSELECT utasításokban. Ezzel konzisztenciát biztosít a INSERT, UPDATE, MERGEés DELETE utasításokban való használatához.
Interoperability
A TOP kifejezés nem befolyásolja az eseményindító miatt futtatható utasításokat. Az eseményindítók inserted és deleted táblái csak a INSERT, UPDATE, MERGEvagy DELETE utasítások által ténylegesen érintett sorokat adnak vissza. Ha például egy INSERT TRIGGER egy INSERT záradékot használó TOP utasítás eredményeként aktiválódik.
Az SQL Server lehetővé teszi a sorok nézeteken keresztüli frissítését. Mivel a TOP záradékot belefoglalhatja a nézetdefinícióba, bizonyos sorok eltűnhetnek a nézetből, ha a sorok egy frissítés miatt már nem felelnek meg a TOP kifejezés követelményeinek.
Ha a TOP záradék tovább csökkenti az összekapcsolt sorok számát a megadott értékre, és a beszúrási, frissítési vagy törlési műveletek rendezetlen módon vonatkoznak a többi illesztett sorra. Vagyis nincs olyan sorrend, amelyben a sorok el vannak osztva a WHEN záradékokban meghatározott műveletek között. Ha például a TOP (10) megadása 10 sort érint, akkor ezek közül hét sor frissíthető, három pedig beszúrható. Vagy törölhet egyet, öt frissített és négy beszúrt, és így tovább. Mivel a MERGE utasítás a forrás- és a céltáblák teljes táblázatvizsgálatát is elvégzi, az I/O-teljesítmény akkor lehet hatással, ha a TOP záradék használatával módosít egy nagy táblát több köteg létrehozásával. Ebben a forgatókönyvben fontos biztosítani, hogy minden egymást követő köteg új sorokat célozhasson meg.
Óvatosan adja meg a TOP záradékot egy olyan lekérdezésben, amely UNION, UNION ALL, EXCEPTvagy INTERSECT operátort tartalmaz. Lehetséges olyan lekérdezést írni, amely váratlan eredményeket ad vissza, mert a TOP és ORDER BY záradékok logikai feldolgozásának sorrendje nem mindig intuitív, amikor ezeket az operátorokat egy kiválasztási műveletben használják. Az alábbi táblázat és adatok alapján például tegyük fel, hogy a legkevésbé költséges piros autót és a legkevésbé költséges kék autót szeretné visszaadni. Vagyis a vörös sedan és a kék furgon.
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');
Az eredmények eléréséhez a következő lekérdezést kell írnia.
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
Itt van az eredményhalmaz.
Model Color Price
------------- ---------- -------
sedan red 10000.00
convertible blue 15000.00
A váratlan eredmények azért jelennek meg, mert a TOP záradék logikailag a ORDER BY záradék előtt fut, amely rendezi az operátor eredményeit (ebben az esetbenUNION ALL). Az előző lekérdezés tehát egy piros autót és egy kék autót ad vissza, majd az ár alapján rendeli el az unió eredményét. Az alábbi példa a lekérdezés megfelelő írási módját mutatja be a kívánt eredmény eléréséhez.
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
Ha TOP és ORDER BY használ egy alválasztási műveletben, győződjön meg arról, hogy a ORDER BY záradék eredményei a TOP záradékra vonatkoznak, és nem a UNION művelet eredményének rendezésére.
Itt van az eredményhalmaz.
Model Color Price
------------- ---------- -------
sedan red 10000.00
van blue 8000.00
Limitations
Ha TOP, INSERT, UPDATEvagy MERGEDELETE használ, a hivatkozott sorok semmilyen sorrendben nincsenek elrendezve. A ORDER BY záradékot pedig közvetlenül nem adhatja meg ezekben az utasításokban. Ha TOP kell használnia a sorok értelmes időrendi sorrendben való beszúrásához, törléséhez vagy módosításához, használja a TOP egy alkijelölési utasításban megadott ORDER BY záradékkal. Lásd a jelen cikk Példák szakaszát.
A particionált nézetek TOP vagy UPDATE utasításaiban nem használhat DELETE.
A TOP nem kombinálhatja OFFSET és FETCH ugyanabban a lekérdezési kifejezésben (ugyanabban a lekérdezési hatókörben). További információ: SELECT – ORDER BY záradék.
Examples
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
| Category | Kiemelt szintaxiselemek |
|---|---|
| Alapvető szintaxis | TOP * PERCENT |
| A döntetlen értékek | WITH TIES |
| A DELETE, INSERT vagy UPDATE által érintett sorok korlátozása | \ |
Alapszintű szintaxis
Az ebben a szakaszban szereplő példák a ORDER BY záradék alapvető funkcióit mutatják be a minimálisan szükséges szintaxis használatával.
A. A TOP használata állandó értékkel
Az alábbi példák állandó értéket használnak a lekérdezés eredményhalmazában visszaadott alkalmazottak számának megadásához. Az első példában az első 10 nem definiált sort adja vissza a rendszer, mert nem használ ORDER BY záradékot. A második példában egy ORDER BY záradékkal adja vissza a 10 legutóbb felvett alkalmazottat.
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. TOP használata változóval
Az alábbi példa egy változót használ a lekérdezés eredményhalmazában visszaadott alkalmazottak számának megadásához.
USE AdventureWorks2022;
GO
DECLARE @p AS INT = 10;
SELECT TOP (@p) JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO
C. Százalékos érték megadása
Az alábbi példa PERCENT használatával adja meg a lekérdezés eredményhalmazában visszaadott alkalmazottak számát. A HumanResources.Employee táblában 290 alkalmazott található. Mivel a 290 5%-a tört érték, az érték a következő egész számra lesz kerekítve.
USE AdventureWorks2022;
GO
SELECT TOP (5) PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
Döntetlen értékek belefoglalása
A. A WITH TIES használata az utolsó sor értékeinek megfelelő sorok belefoglalására
Az alábbi példa a legmagasabb fizetéssel rendelkező alkalmazottak felső 10 százalékát kapja meg, és a fizetésüknek megfelelően csökkenő sorrendben adja vissza őket. A WITH TIES megadásával biztosítható, hogy a legalacsonyabb visszaadott fizetéssel (az utolsó sor) egyenlő fizetéssel rendelkező alkalmazottak is bekerüljenek az eredményhalmazba, még akkor is, ha az meghaladja 10 százalékos arányt.
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
A DELETE, INSERT vagy UPDATE által érintett sorok korlátozása
A. A TOP használatával korlátozhatja a törölt sorok számát
Ha TOP (<n>)DELETE záradékot használ, a törlési művelet nem definiált n sorszámon történik. Ez azt jelzi, hogy a DELETE utasítás az záradékban meghatározott feltételeknek megfelelő sorok tetszőleges (WHERE) számát választja ki. Az alábbi példa 20 sorokat töröl a PurchaseOrderDetail táblából, amelyek határideje 2002.
USE AdventureWorks2022;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Ha a TOP használatával szeretné törölni a sorokat jelentős időrendi sorrendben, használja a TOPORDER BY alkijelölési utasításban. Az alábbi lekérdezés törli a PurchaseOrderDetail tábla 10 sorát, amelyek a legkorábbi határidővel rendelkeznek. Annak érdekében, hogy csak 10 sort töröljön, az alkijelölési utasításban megadott oszlop (PurchaseOrderID) a tábla elsődleges kulcsa. Ha az alkijelölési utasításban nem kulcs típusú oszlopot használ, az több mint 10 sor törlését eredményezheti, ha a megadott oszlop ismétlődő értékeket tartalmaz.
USE AdventureWorks2022;
GO
DELETE Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN (
SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC
);
GO
B. A TOP használatával korlátozhatja a beszúrt sorok számát
Az alábbi példa létrehozza a táblát EmployeeSales, és beszúrja a tábla HumanResources.Employeeelső öt alkalmazottjának nevét és évről évre vonatkozó értékesítési adatait. A INSERT utasítás a SELECT utasítás által visszaadott öt sort választja ki, amelyek megfelelnek a WHERE záradékban meghatározott feltételeknek. A OUTPUT záradék megjeleníti a EmployeeSales táblába beszúrt sorokat. A ORDER BY utasítás SELECT záradéka nem az első öt alkalmazott meghatározására szolgál.
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
Ha TOP szeretne sorokat beszúrni egy értelmezhető időrendi sorrendbe, használja a TOPORDER BY alkijelölési utasításban. Az alábbi példa bemutatja, hogyan teheti ezt meg. A OUTPUT záradék megjeleníti a EmployeeSales táblába beszúrt sorokat. A rendszer most a ORDER BY záradék eredményei alapján szúrja be az első öt alkalmazottat a nem definiált sorok helyett.
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. A TOP használatával korlátozhatja a frissített sorok számát
Az alábbi példa a TOP záradékot használja egy tábla sorainak frissítéséhez. Ha TOP (<n>)UPDATE záradékot használ, a frissítési művelet meghatározatlan számú soron fut. Ez azt jelzi, hogy a UPDATE utasítás az záradékban meghatározott feltételeknek megfelelő sorok tetszőleges (WHERE) számát választja ki. Az alábbi példa 10 ügyfelet rendel hozzá az egyik értékesítőtől a másikhoz.
USE AdventureWorks2022;
UPDATE TOP (10)
Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
Ha TOP kell használnia a frissítéseket egy értelmes kronológiában, a TOP és ORDER BY együtt kell használnia egy alkijelölési utasításban. Az alábbi példa a 10 alkalmazott szabadságát frissíti a legkorábbi felvételi dátumokkal.
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
Példák: Azure Synapse Analytics and Analytics Platform System (PDW)
Az alábbi példa a lekérdezési feltételeknek megfelelő első 31 sort adja vissza. A ORDER BY záradék biztosítja, hogy a 31 visszaadott sor legyen az első 31 sor a LastName oszlop betűrend szerinti sorrendje alapján.
A TOP használata a kötelékek megadása nélkül.
SELECT TOP (31) FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Eredmény: 31 sort ad vissza a rendszer.
A TOPhasználatával adja meg a WITH TIES.
SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Eredmény: 33 sort ad vissza a rendszer, mert három alkalmazott neve Brown döntetlen a 31. sorhoz.