- 16.03.2017
- 11 minute de citit
-
- V
- M
- r
- c
- d
-
+12
Se aplică la: SQL Server (toate versiunile acceptate) Azure SQL Database Instanță administrată Azure SQL Azure Synapse Analytics Depozit paralel de date
Limită rândurile returnate într-un set de rezultate ale interogării la un număr specificat de rânduri sau procent de rânduri în SQL Server. Când utilizați TOP cu clauza ORDER BY, setul de rezultate este limitat la primul N număr de rânduri ordonate. În caz contrar, TOP returnează primul N număr de rânduri într-o ordine nedefinită. Utilizați această clauză pentru a specifica numărul de rânduri returnate dintr-o instrucțiune SELECT. Sau utilizați TOP pentru a specifica rândurile afectate de o instrucțiune INSERT, UPDATE, MERGE sau DELETE.
Convenții de sintaxă Transact-SQL
Sintaxă
Urmează sintaxa pentru SQL Server și baza de date SQL Azure:
Urmează sintaxa pentru Azure Synapse Analytics și Parallel Data Warehouse:
Notă
Pentru a vizualiza sintaxa Transact-SQL pentru SQL Server 2014 și versiunile anterioare, consultați documentația versiunilor anterioare .
Argumente
expresie
Expresia numerică care specifică numărul de rânduri care trebuie returnate. expresia este implicit convertită la o valoare float dacă specificați PERCENT. În caz contrar, expresia este convertită în bigint.
PERCENT
Indică faptul că interogarea returnează numai prima expresie procentuală de rânduri din setul de rezultate. Valorile fracționare sunt rotunjite la următoarea valoare întreagă.
WITH TIES
Returnează două sau mai multe rânduri care se leagă pentru ultimul loc în setul limitat de rezultate. Trebuie să utilizați acest argument împreună cu clauza ORDER BY. WITH TIES poate determina returnarea mai multor rânduri decât valoarea specificată în expresie. De exemplu, dacă expresia este setată la 5, dar două rânduri suplimentare se potrivesc cu valorile coloanelor ORDER BY din rândul 5, setul de rezultate va conține șapte rânduri.
Puteți specifica clauza TOP cu legăturile WITH argument numai în instrucțiunile SELECT și numai dacă ați specificat și clauza ORDER BY. Ordinea returnată de legare a înregistrărilor este arbitrară. ORDER BY nu afectează această regulă.
Cele mai bune practici
Într-o instrucțiune SELECT, utilizați întotdeauna o clauză ORDER BY cu clauza TOP. Deoarece, este singura modalitate de a indica în mod previzibil care rânduri sunt afectate de TOP.
Utilizați OFFSET și FETCH în clauza ORDER BY în loc de clauza TOP pentru a implementa o soluție de interogare de paginare. O soluție de paginare ( adică trimiterea de bucăți sau „pagini” de date către client) este mai ușor de implementat folosind clauzele OFFSET și FETCH. Pentru mai multe informații, consultați Clauza ORDER BY (Transact-SQL).
Utilizați TOP (sau OFFSET și FETCH) în loc de SET ROWCOUNT pentru a limita numărul de rânduri returnate. Aceste metode sunt preferate față de utilizarea SET ROWCOUNT din următoarele motive:
- Ca parte a unei instrucțiuni SELECT, optimizatorul de interogare poate lua în considerare valoarea expresiei din clauzele TOP sau FETCH în timpul optimizării interogării. Deoarece utilizați SET ROWCOUNT în afara unei instrucțiuni care execută o interogare, valoarea acesteia nu poate fi luată în considerare într-un plan de interogare.
Suport de compatibilitate
Pentru compatibilitate inversă, parantezele sunt opționale în instrucțiunile SELECT dacă expresia este o const furnică. Vă recomandăm să utilizați întotdeauna paranteze pentru TOP în instrucțiunile SELECT. Acest lucru oferă coerență cu utilizarea necesară în instrucțiunile INSERT, UPDATE, MERGE și DELETE.
Interoperabilitate
Expresia TOP nu afectează declarațiile care ar putea rula din cauza unui declanșator. Tabelele inserate și șterse din declanșatoare returnează numai rândurile care sunt cu adevărat afectate de instrucțiunile INSERT, UPDATE, MERGE sau DELETE. De exemplu, dacă se declanșează un INSERT TRIGGER ca urmare a unei instrucțiuni INSERT care a folosit o clauză TOP.
SQL Server permite actualizarea rândurilor prin vizualizări. Deoarece puteți include clauza TOP în definiția vizualizării, anumite rânduri pot dispărea din vizualizare dacă rândurile nu mai îndeplinesc cerințele expresiei TOP din cauza unei actualizări .
Când este specificat în instrucțiunea MERGE, clauza TOP se aplică după ce întreaga tabelă sursă și întreaga tabelă țintă sunt unite. Și rândurile unite care nu se califică pentru o inserare, actualizare sau ștergere acțiunea este eliminată. Clauza TOP reduce și mai mult numărul de rânduri unite la valoarea specificată, iar acțiunile de inserare, actualizare sau ștergere se aplică rândurilor unite rămase într-un mod neordonat. Adică, nu există nicio ordine în care rândurile să fie distribuite între acțiunile definite în clauzele WHEN.De exemplu, dacă specificarea TOP (10) afectează 10 rânduri, dintre aceste rânduri, șapte pot fi actualizate și trei inserate. Sau, una poate fi ștearsă, cinci actualizate și patru inserate și așa mai departe. Deoarece declarația MERGE efectuează o scanare completă a tabelelor atât a tabelelor sursă, cât și a tabelelor țintă, performanța I / O poate fi afectată atunci când utilizați clauza TOP pentru a modifica un tabel mare prin crearea mai multor loturi. În acest scenariu, este important să vă asigurați că toate loturile succesive vizează rânduri noi.
Aveți grijă când specificați clauza TOP într-o interogare care conține UNION, UNION ALL, EXCEPT sau INTERSECT operator. Este posibil să scrieți o interogare care returnează rezultate neașteptate, deoarece ordinea în care clauzele TOP și ORDER BY sunt procesate logic nu este întotdeauna intuitivă atunci când acești operatori sunt utilizați într-o operație selectată. De exemplu, având în vedere următorul tabel și date, presupuneți că doriți să returnați mașina roșie mai puțin costisitoare și cea mai puțin costisitoare mașină albastră. Adică, sedanul roșu și duba albastră.
Pentru a obține aceste rezultate, puteți scrie următoarea interogare.
Următorul este setul de rezultate.
Rezultatele neașteptate sunt returnate deoarece clauza TOP rulează logic înainte de clauza ORDER BY, care sortează rezultatele operatorului (UNION ALL în acest caz). Deci, interogarea anterioară returnează orice mașină roșie și orice mașină albastră și apoi comandă rezultatul acelei uniuni după preț. Următorul exemplu arată metoda corectă de scriere a acestei interogări pentru a obține rezultatul dorit.
Prin utilizarea TOP și ORDER BY într-o operație de subselectare, vă asigurați că rezultatele clauzei ORDER BY sunt aplicate TOP clauză și nu la sortarea rezultatului operațiunii UNION.
Iată setul de rezultate.
Limitări și restricții
Când utilizați TOP cu INSERT, UPDATE, MERGE sau DELETE, rândurile la care se face referință nu sunt aranjate în orice ordine. Și nu puteți specifica direct clauza ORDER BY în aceste instrucțiuni. Dacă trebuie să utilizați TOP pentru a insera, șterge sau modifica rânduri într-o ordine cronologică semnificativă, utilizați TOP cu o clauză ORDER BY specificată într-o instrucțiune subselect. Consultați următoarea secțiune Exemple din acest articol.
Nu puteți utiliza TOP într-o instrucțiuni UPDATE și DELETE pentru vizualizările partiționate.
Nu puteți combina TOP cu OFFSET și FETCH în aceeași expresie de interogare (în același domeniu de interogare). Pentru mai multe informații, consultați Clauza ORDER BY (Transact-SQL).
Exemple
Categorie | Elemente de sintaxă recomandate |
---|---|
Sintaxa de bază | TOP • PERCENT |
Inclusiv valorile de egalizare | CU TIES |
Limitarea rândurilor afectate de DELETE, INSERT sau UPDATE | DELETE • INSERT • UPDATE |
Sintaxa de bază
Exemplele din această secțiune demonstrează funcționalitatea de bază a clauzei ORDER BY utilizând sintaxa minimă necesară.
A. Utilizarea TOP cu o valoare constantă
Următoarele exemple utilizează o valoare constantă pentru a specifica numărul de angajați care sunt returnați în setul de rezultate ale interogării. În primul exemplu, primele 10 rânduri nedefinite sunt returnate deoarece nu este utilizată o clauză ORDER BY. În al doilea exemplu, se utilizează o clauză ORDER BY pentru a returna primii 10 angajați recent angajați.
B. Utilizarea TOP cu o variabilă
Următorul exemplu folosește o variabilă pentru a specifica numărul de angajați care sunt returnați în setul de rezultate ale interogării.
C. Specificarea unui procent
Următorul exemplu folosește PERCENT pentru a specifica numărul de angajați care sunt returnați în setul de rezultate ale interogării. Există 290 angajații din tabelul HumanResources.Employee
. Deoarece cinci la sută din 290 reprezintă o valoare fracțională, valoarea este rotunjită la următorul număr întreg.
Includerea valorilor de egalizare
A. Folosind WITH TIES pentru a include rânduri care se potrivesc valorilor din ultimul rând
Următorul exemplu obține partea de sus 10
la sută din toți angajații cu cel mai mare salariu a le returnează în ordine descrescătoare în funcție de salariul lor. Specificarea WITH TIES
asigură că angajații cu salarii egale cu cel mai mic salariu returnat (ultimul rând) sunt incluși și în setul de rezultate, chiar dacă depășește 10
procent de angajați.
Limitarea rândurilor afectate de DELETE, INSERT sau UPDATE
A. Utilizarea TOP pentru a limita numărul de rânduri șterse
Când utilizați o clauză TOP (n) cu DELETE, operația de ștergere se face pe o selecție nedefinită de n număr de rânduri. Adică, instrucțiunea DELETE alege orice (n) număr de rânduri care îndeplinesc criteriile definite în clauza WHERE.Următorul exemplu șterge 20
rândurile din tabelul PurchaseOrderDetail
care au scadențe mai vechi de 1 iulie 2002.
Dacă doriți să utilizați TOP pentru a șterge rânduri într-o ordine cronologică semnificativă, utilizați TOP cu ORDER BY într-o instrucțiune subselect. Următoarea interogare șterge cele 10 rânduri ale tabelului PurchaseOrderDetail
care au primele date scadente. Pentru a vă asigura că sunt șterse doar 10 rânduri, coloana specificată în instrucțiunea subselect (PurchaseOrderID
) este cheia principală a tabelului. Utilizarea unei coloane nonkey în instrucțiunea subselectare poate duce la ștergerea a mai mult de 10 rânduri dacă coloana specificată conține valori duplicat.
B. Utilizarea TOP pentru a limita numărul de rânduri inserate
Următorul exemplu creează tabelul EmployeeSales
și introduce numele și datele de vânzări de la an la an pentru primele cinci angajați din tabel HumanResources.Employee
. Instrucțiunea INSERT alege orice cinci rânduri returnate de instrucțiunea SELECT
care îndeplinesc criteriile definite în clauza WHERE. Clauza OUTPUT afișează rândurile care sunt inserate în tabelul EmployeeSales
. Observați că clauza ORDER BY din declarația SELECT nu este utilizată pentru a determina primii cinci angajați.
Dacă doriți să utilizați TOP pentru a insera rânduri într-o ordine cronologică semnificativă, utilizați TOP cu ORDER BY într-un declarație subselect. Următorul exemplu arată cum se face acest lucru. Clauza OUTPUT afișează rândurile care sunt inserate în tabelul EmployeeSales
. Observați că primii cinci angajați sunt acum inserați pe baza rezultatelor din clauza ORDER BY în loc de rânduri nedefinite.
C. Utilizarea TOP pentru a limita numărul de rânduri actualizate
Următorul exemplu folosește clauza TOP pentru a actualiza rândurile dintr-un tabel. Când utilizați o clauză TOP (n) cu UPDATE, operația de actualizare rulează pe un număr nedefinit de rânduri. Adică instrucțiunea UPDATE alege orice (n) număr de rânduri care se întâlnesc criteriile definite în clauza WHERE. Următorul exemplu atribuie 10 clienți de la un agent de vânzări la altul.
Dacă trebuie să utilizați TOP pentru a aplica actualizări într-o cronologie semnificativă, trebuie să utilizați TOP împreună cu ORDER BY într-o declarație de subselecție. Următorul exemplu actualizează orele de concediu ale celor 10 angajați cu primele date de angajare.
Exemple: Azure Synapse Analytics și Parallel Data Warehouse
Următorul exemplu returnează primele 31 de rânduri care corespund criteriilor de interogare. Clauza ORDER BY asigură că cele 31 de rânduri returnate sunt primele 31 de rânduri bazate pe o ordonare alfabetică a coloanei LastName
.
Folosind TOP fără a specifica legături.
Rezultat: se returnează 31 de rânduri.
Folosind TOP, specificând CU TIES.
Rezultat: 33 de rânduri sunt returnate, deoarece trei angajați au numit Brown tie pentru al 31-lea rând.