- 16. 3. 2017
- 11 minut ke čtení
-
- V
- M
- r
- c
- d
-
+12
Platí pro: SQL Server (všechny podporované verze) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Omezuje řádky vrácené v sadě výsledků dotazu na zadaný počet řádků nebo procento řádků na serveru SQL Server. Když použijete TOP s klauzulí ORDER BY, výsledková sada je omezena na prvních N počet objednaných řádků. Jinak TOP vrátí první N počet řádků v nedefinovaném pořadí. Tuto klauzuli použijte k určení počtu řádků vrácených z příkazu SELECT. Nebo použijte TOP k určení řádků ovlivněných příkazem INSERT, UPDATE, MERGE nebo DELETE.
Konvence syntaxe Transact-SQL
Syntaxe
Následuje syntaxe pro SQL Server a Azure SQL Database:
Následuje syntaxe pro Azure Synapse Analytics a Parallel Data Warehouse:
Poznámka
Chcete-li zobrazit syntaxi Transact-SQL pro SQL Server 2014 a starší, přečtěte si dokumentaci Předchozí verze .
Argumenty
výraz
Číselný výraz, který určuje počet řádků, které mají být vráceny. výraz je implicitně převeden na plovoucí hodnotu, pokud zadáte PERCENT. Jinak se výraz převede na bigint.
PERCENT
Označuje, že dotaz vrátí pouze první procento výrazů řádků z výsledkové sady. Frakční hodnoty jsou zaokrouhleny nahoru na další celočíselnou hodnotu.
WIES TIES
Vrátí dva nebo více řádků, které se shodují s posledním místem v omezené sadě výsledků. Tento argument musíte použít s klauzulí ORDER BY. WITH TIES může způsobit, že bude vráceno více řádků, než je hodnota uvedená ve výrazu. Například pokud je výraz nastaven na 5, ale dva další řádky odpovídají hodnotám sloupců OBJEDNAT PODLE řádku 5, výsledková sada bude obsahovat sedm řádků.
Klauzuli TOP můžete určit pomocí WITH TIES argument pouze v příkazech SELECT a pouze v případě, že jste zadali také klauzuli ORDER BY. Vrácené pořadí vázaných záznamů je libovolné. ORDER BY toto pravidlo neovlivní.
Doporučené postupy
V příkazu SELECT vždy používejte klauzuli ORDER BY s klauzulí TOP. Protože je to jediný způsob, jak předvídatelně označit, které řádky jsou ovlivněny TOP.
K implementaci řešení stránkovacího dotazu použijte místo klauzule ORDER BY OFFSET a FETCH. Řešení stránkování ( tj. odesílání bloků nebo „stránek“ dat klientovi) je snazší implementovat pomocí klauzulí OFFSET a FETCH. Další informace najdete v klauzuli ORDER BY (Transact-SQL).
Použijte TOP (nebo OFFSET a FETCH) místo SET ROWCOUNT k omezení počtu vrácených řádků. Tyto metody jsou upřednostňovány před použitím SET ROWCOUNT z následujících důvodů:
- Jako součást příkazu SELECT optimalizátor dotazů může zohlednit hodnotu výrazu v klauzulích TOP nebo FETCH během optimalizace dotazu. Protože používáte SET ROWCOUNT mimo příkaz, který spouští dotaz, jeho hodnotu nelze v plánu dotazu zohlednit.
Podpora kompatibility
Pro zpětnou kompatibilitu jsou závorky v příkazech SELECT volitelné, pokud je výraz celočíselná konst. mravenec. Doporučujeme vždy použít závorky pro TOP v příkazech SELECT. Tímto způsobem zajistíte konzistenci s jeho požadovaným použitím v příkazech INSERT, UPDATE, MERGE a DELETE.
Interoperabilita
TOP výraz neovlivní příkazy, které by se mohly spustit z důvodu spouštěče. Vložené a odstraněné tabulky ve spouštěčích vrátí pouze řádky, které jsou skutečně ovlivněny příkazy INSERT, UPDATE, MERGE nebo DELETE. Například pokud se INSERT TRIGGER spustí jako výsledek příkazu INSERT, který použil klauzuli TOP.
SQL Server umožňuje aktualizaci řádků prostřednictvím pohledů. Protože můžete do definice pohledu zahrnout klauzuli TOP, mohou určité řádky z pohledu zmizet, pokud řádky kvůli aktualizaci již nesplňují požadavky výrazu TOP. .
Pokud je uvedeno v příkazu SLOUČENÍ, klauzule TOP se použije poté, co se spojí celá zdrojová tabulka a celá cílová tabulka. A spojené řádky, které se nekvalifikují pro vložení, aktualizaci nebo odstranění akce jsou odstraněny. Klauzule TOP dále snižuje počet spojených řádků na zadanou hodnotu a akce vložení, aktualizace nebo odstranění se vztahují na zbývající spojené řádky neuspořádaným způsobem. To znamená, že neexistuje pořadí, ve kterém jsou řádky distribuovány mezi akce definované v klauzulích KDYŽ.Například pokud určení TOP (10) ovlivní 10 řádků, z těchto řádků může být aktualizováno sedm a tři vloženy. Nebo jeden může být odstraněn, pět aktualizováno a čtyři vloženy atd. Protože příkaz SLOUČENÍ provádí úplnou kontrolu tabulky zdrojové i cílové tabulky, může být ovlivněn výkon I / O při použití klauzule TOP k úpravě velké tabulky vytvořením více dávek. V tomto scénáři je důležité zajistit, aby všechny následující dávky zacílily na nové řádky.
Buďte opatrní, když zadáváte klauzuli TOP v dotazu, který obsahuje UNION, UNION ALL, EXCEPT nebo INTERSECT operátor. Je možné napsat dotaz, který vrací neočekávané výsledky, protože pořadí, ve kterém jsou logicky zpracovány klauzule TOP a ORDER BY, není vždy intuitivní, když jsou tyto operátory použity v operaci výběru. Například vzhledem k následující tabulce a údajům předpokládejme, že chcete vrátit nejméně nákladné červené auto a nejméně nákladné modré auto. To znamená, červený sedan a modrá dodávka.
K dosažení těchto výsledků můžete napsat následující dotaz.
Následuje sada výsledků.
Neočekávané výsledky jsou vráceny, protože klauzule TOP logicky běží před klauzulí ORDER BY, která seřadí výsledky operátoru (v tomto případě UNION ALL). Takže předchozí dotaz vrátí jedno červené auto a kterékoli modré auto a poté objedná výsledek tohoto spojení podle ceny. Následující příklad ukazuje správnou metodu psaní tohoto dotazu k dosažení požadovaného výsledku.
Použitím TOP a ORDER BY v operaci podvýběru zajistíte, že výsledky klauzule ORDER BY budou použity na TOP klauzule a ne třídění výsledku operace UNION.
Zde je sada výsledků.
Omezení a omezení
Když použijete TOP s INSERT, UPDATE, MERGE nebo DELETE, odkazované řádky nejsou uspořádány v žádném pořadí. V těchto příkazech nemůžete přímo specifikovat klauzuli ORDER BY. Pokud potřebujete použít TOP k vložení, odstranění nebo úpravě řádků ve smysluplném chronologickém pořadí, použijte TOP s klauzulí ORDER BY uvedenou v příkazu podvýběru. Podívejte se na následující část Příklady v tomto článku.
V příkazech UPDATE a DELETE v rozdělených zobrazeních nemůžete použít TOP.
TOP nelze kombinovat s OFFSET a FETCH v stejný výraz dotazu (ve stejném rozsahu dotazu). Další informace najdete v klauzuli ORDER BY (Transact-SQL).
Příklady
Kategorie | Vybrané prvky syntaxe |
---|---|
Základní syntaxe | NAHORU • PERCENT |
Včetně hodnot kravaty | S VÁZANÍ |
Omezení řádků ovlivněných příkazy DELETE, INSERT nebo UPDATE | DELETE • INSERT • UPDATE |
Základní syntaxe
Příklady v této části ukazují základní funkčnost klauzule ORDER BY pomocí minimální požadované syntaxe.
A. Použití TOP s konstantní hodnotou
Následující příklady používají konstantní hodnotu k určení počtu zaměstnanců, kteří jsou vráceni v sadě výsledků dotazu. V prvním příkladu se vrací prvních 10 nedefinovaných řádků, protože se nepoužije klauzule ORDER BY. Ve druhém příkladu se klauzule ORDER BY používá k návratu 10 nejlepších nedávno najatých zaměstnanců.
B. Použití funkce TOP s proměnnou
Následující příklad používá proměnnou k určení počtu zaměstnanců, kteří jsou vráceni v sadě výsledků dotazu.
C. Určení procenta
Následující příklad používá PERCENT k určení počtu zaměstnanců, kteří jsou vráceni v sadě výsledků dotazu. K dispozici je 290 zaměstnanci v HumanResources.Employee
tabulce. Protože pět procent z 290 je zlomková hodnota, hodnota se zaokrouhlí nahoru na další celé číslo.
Včetně shodných hodnot
A. Použití příkazu WITH TIES k zahrnutí řádků, které odpovídají hodnotám v posledním řádku
Následující příklad získá vrchol 10
procent všech zaměstnanců s nejvyšším platem a vrátí je v sestupném pořadí podle jejich platu. Specifikace WITH TIES
zajistí, že do sady výsledků budou zahrnuti i zaměstnanci s platy rovnými nejnižšímu vrácenému platu (poslední řádek), i když přesáhne 10
procento zaměstnanců.
Omezení řádků ovlivněných příkazy DELETE, INSERT nebo UPDATE
A. Použití TOP k omezení počtu odstraněných řádků
Když použijete klauzuli TOP (n) s DELETE, operace mazání se provede u nedefinovaného výběru n počtu řádků. To znamená, že příkaz DELETE vybere libovolný (n) počet řádků, které splňují kritéria definovaná v klauzuli WHERE.Následující příklad odstraní 20
řádky z PurchaseOrderDetail
tabulky, které mají splatnost před 1. červencem 2002.
Chcete-li použít TOP k mazání řádků ve smysluplném chronologickém pořadí, použijte TOP s ORDER BY v příkazu podvýběru. Následující dotaz odstraní 10 řádků tabulky PurchaseOrderDetail
, které mají nejbližší termíny splatnosti. Aby bylo zajištěno, že bude smazáno pouze 10 řádků, je primárním klíčem tabulky sloupec uvedený v příkazu subselect (PurchaseOrderID
). Použití sloupce bez klíče v příkazu subselect může vést k odstranění více než 10 řádků, pokud zadaný sloupec obsahuje duplicitní hodnoty.
B. Použití TOP k omezení počtu vložených řádků
Následující příklad vytvoří tabulku EmployeeSales
a vloží název a údaje o prodeji za rok pro prvních pět zaměstnanci z tabulky HumanResources.Employee
. Příkaz INSERT vybere libovolných pět řádků vrácených příkazem SELECT
, které splňují kritéria definovaná v klauzuli WHERE. Klauzule OUTPUT zobrazuje řádky, které jsou vloženy do EmployeeSales
tabulky. Všimněte si, že klauzule ORDER BY v příkazu SELECT není použita k určení pěti nejlepších zaměstnanců.
Chcete-li použít TOP k vložení řádků ve smysluplném chronologickém pořadí, použijte TOP s ORDER BY v příkaz subselect. Následující příklad ukazuje, jak to udělat. Klauzule OUTPUT zobrazuje řádky, které jsou vloženy do tabulky EmployeeSales
. Všimněte si, že prvních pět zaměstnanců je nyní vloženo na základě výsledků klauzule ORDER BY místo nedefinovaných řádků.
C. Použití TOP k omezení počtu aktualizovaných řádků
Následující příklad používá klauzuli TOP k aktualizaci řádků v tabulce. Když použijete klauzuli TOP (n) s UPDATE, operace aktualizace běží na nedefinovaném počtu řádků. To znamená, že příkaz UPDATE zvolí libovolný (n) počet řádků, které splňují kritéria definovaná v klauzuli WHERE. Následující příklad přiřadí 10 zákazníků od jednoho prodejce k druhému.
Pokud musíte použijte TOP k použití aktualizací ve smysluplné chronologii, musíte použít TOP společně s ORDER BY v příkazu podvýběru. Následující příklad aktualizuje pracovní dobu 10 zaměstnanců s nejčasnějšími daty pronájmu.
Příklady: Azure Synapse Analytics a Parallel Data Warehouse
Následující příklad vrací prvních 31 řádků, které odpovídají kritériím dotazu. Klauzule ORDER BY zajišťuje, že 31 vrácených řádků je prvních 31 řádků na základě abecedního řazení sloupce LastName
.
Použití TOP bez zadání vazeb.
Výsledek: Vráceno je 31 řádků.
Pomocí příkazu TOP určete WITH TIES.
Výsledek: Vráceno je 33 řádků, protože tři zaměstnanci s názvem Brown se shodují pro 31. řádek.