- 16/03/2017
- 11 minuti per la lettura
-
- V
- M
- r
- c
- d
-
+12
Si applica a: SQL Server (tutte le versioni supportate) Database SQL di Azure Istanza gestita di Azure SQL Azure Synapse Analytics Parallel Data Warehouse
Limita le righe restituite in un set di risultati di query a un numero specificato di righe o una percentuale di righe in SQL Server. Quando si utilizza TOP con la clausola ORDER BY, il set di risultati è limitato al primo numero N di righe ordinate. Altrimenti, TOP restituisce il primo numero N di righe in un ordine indefinito. Utilizzare questa clausola per specificare il numero di righe restituite da unistruzione SELECT. In alternativa, utilizza TOP per specificare le righe interessate da unistruzione INSERT, UPDATE, MERGE o DELETE.
Convenzioni della sintassi Transact-SQL
Sintassi
Di seguito è riportata la sintassi per SQL Server e il database SQL di Azure:
Di seguito è riportata la sintassi per Azure Synapse Analytics e Parallel Data Warehouse:
Nota
Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere la documentazione delle versioni precedenti .
Argomenti
espressione
Lespressione numerica che specifica il numero di righe da restituire. espressione viene convertita implicitamente in un valore float se si specifica PERCENT. In caso contrario, lespressione viene convertita in bigint.
PERCENT
Indica che la query restituisce solo la prima percentuale di espressione di righe dal set di risultati. I valori frazionari vengono arrotondati al valore intero successivo.
WITH TIES
Restituisce due o più righe che coincidono per lultimo posto nel set di risultati limitato. È necessario utilizzare questo argomento con la clausola ORDER BY. WITH TIES potrebbe causare la restituzione di più righe rispetto al valore specificato nellespressione. Ad esempio, se lespressione è impostata su 5 ma due righe aggiuntive corrispondono ai valori delle colonne ORDER BY nella riga 5, il set di risultati conterrà sette righe.
Puoi specificare la clausola TOP con WITH TIES argomento solo nelle istruzioni SELECT e solo se hai specificato anche la clausola ORDER BY. Lordine restituito per legare i record è arbitrario. ORDER BY non influisce su questa regola.
Best practice
In unistruzione SELECT, utilizzare sempre una clausola ORDER BY con la clausola TOP. Perché è lunico modo per indicare in modo prevedibile quali righe sono interessate da TOP.
Utilizza OFFSET e FETCH nella clausola ORDER BY invece della clausola TOP per implementare una soluzione di paging della query. Una soluzione di paging ( ovvero, linvio di blocchi o “pagine” di dati al client) è più facile da implementare utilizzando le clausole OFFSET e FETCH. Per ulteriori informazioni, consulta la clausola ORDER BY (Transact-SQL).
Usa TOP (o OFFSET e FETCH) invece di SET ROWCOUNT per limitare il numero di righe restituite. Questi metodi sono preferiti rispetto alluso di SET ROWCOUNT per i seguenti motivi:
- Come parte di unistruzione SELECT, Query Optimizer può considerare il valore dellespressione nelle clausole TOP o FETCH durante lottimizzazione della query. Poiché utilizzi SET ROWCOUNT al di fuori di unistruzione che esegue una query, il suo valore non può essere considerato in un piano di query.
Supporto per la compatibilità
Per la compatibilità con le versioni precedenti, le parentesi sono facoltative nelle istruzioni SELECT se lespressione è un intero const formica. Si consiglia di utilizzare sempre le parentesi per TOP nelle istruzioni SELECT. Ciò fornisce coerenza con il suo uso richiesto nelle istruzioni INSERT, UPDATE, MERGE e DELETE.
Interoperabilità
Lespressione TOP non influenza le istruzioni che potrebbero essere eseguite a causa di un trigger. Le tabelle inserite ed eliminate nei trigger restituiscono solo le righe realmente interessate dalle istruzioni INSERT, UPDATE, MERGE o DELETE. Ad esempio, se un INSERT TRIGGER si attiva come risultato di unistruzione INSERT che utilizzava una clausola TOP.
SQL Server consente di aggiornare le righe tramite le viste. Poiché è possibile includere la clausola TOP nella definizione della vista, alcune righe potrebbero scomparire dalla vista se le righe non soddisfano più i requisiti dellespressione TOP a causa di un aggiornamento .
Quando specificato nellistruzione MERGE, la clausola TOP si applica dopo che lintera tabella di origine e lintera tabella di destinazione sono state unite. Inoltre, le righe unite che non si qualificano per un inserimento, aggiornamento o eliminazione lazione viene rimossa. La clausola TOP riduce ulteriormente il numero di righe unite al valore specificato e le azioni di inserimento, aggiornamento o eliminazione si applicano alle restanti righe unite in modo non ordinato. Ovvero, non esiste un ordine in cui le righe vengono distribuite tra le azioni definite nelle clausole WHEN.Ad esempio, se la specifica TOP (10) interessa 10 righe, di queste righe, sette possono essere aggiornate e tre inserite. Oppure, uno può essere eliminato, cinque aggiornati e quattro inseriti e così via. Poiché listruzione MERGE esegue una scansione completa della tabella delle tabelle di origine e di destinazione, le prestazioni di I / O possono essere influenzate quando si utilizza la clausola TOP per modificare una tabella di grandi dimensioni creando più batch. In questo scenario, è importante assicurarsi che tutti i batch successivi abbiano come destinazione nuove righe.
Fai attenzione quando specifichi la clausola TOP in una query che contiene UNION, UNION ALL, EXCEPT o INTERSECT operatore. È possibile scrivere una query che restituisca risultati imprevisti perché lordine in cui le clausole TOP e ORDER BY vengono elaborate logicamente non è sempre intuitivo quando questi operatori vengono utilizzati in unoperazione di selezione. Ad esempio, in base alla tabella e ai dati seguenti, supponi di voler restituire lauto rossa meno costosa e lauto blu meno costosa. Ovvero, la berlina rossa e il furgone blu.
Per ottenere questi risultati, potresti scrivere la seguente query.
Di seguito è riportato il set di risultati.
I risultati imprevisti vengono restituiti perché la clausola TOP viene eseguita logicamente prima della clausola ORDER BY, che ordina i risultati delloperatore (UNION ALL in questo caso). Quindi, la query precedente restituisce una qualsiasi auto rossa e una qualsiasi auto blu e quindi ordina il risultato di tale unione in base al prezzo. Lesempio seguente mostra il metodo corretto di scrivere questa query per ottenere il risultato desiderato.
Utilizzando TOP e ORDER BY in unoperazione di sottoselezione, ci si assicura che i risultati della clausola ORDER BY siano applicati al TOP clausola e non per ordinare il risultato delloperazione UNION.
Ecco il set di risultati.
Limitazioni e restrizioni
Quando si utilizza TOP con INSERT, UPDATE, MERGE o DELETE, le righe a cui si fa riferimento non sono disposte in alcun ordine. Inoltre, non è possibile specificare direttamente la clausola ORDER BY in queste istruzioni. Se è necessario utilizzare TOP per inserire, eliminare o modificare righe in un ordine cronologico significativo, utilizzare TOP con una clausola ORDER BY specificata in unistruzione subselect. Vedi la seguente sezione Esempi in questo articolo.
Non puoi usare TOP in una istruzione UPDATE e DELETE su viste partizionate.
Non puoi combinare TOP con OFFSET e FETCH in la stessa espressione di query (nello stesso ambito di query). Per ulteriori informazioni, consulta la clausola ORDER BY (Transact-SQL).
Esempi
Categoria | Elementi di sintassi in primo piano |
---|---|
Sintassi di base | TOP • PERCENT |
Inclusione dei valori di parità | WITH TIES |
Limitazione delle righe interessate da DELETE, INSERT o UPDATE | DELETE • INSERT • UPDATE |
Sintassi di base
Gli esempi in questa sezione dimostrano la funzionalità di base della clausola ORDER BY utilizzando la sintassi minima richiesta.
UN. Utilizzo di TOP con un valore costante
I seguenti esempi utilizzano un valore costante per specificare il numero di dipendenti che vengono restituiti nel set di risultati della query. Nel primo esempio, vengono restituite le prime 10 righe indefinite perché non viene utilizzata una clausola ORDER BY. Nel secondo esempio, una clausola ORDER BY viene utilizzata per restituire i primi 10 dipendenti assunti di recente.
B. Utilizzo di TOP con una variabile
Lesempio seguente utilizza una variabile per specificare il numero di dipendenti restituiti nel set di risultati della query.
C. Specifica di una percentuale
Lesempio seguente utilizza PERCENT per specificare il numero di dipendenti restituiti nel set di risultati della query. Ce ne sono 290 dipendenti nella tabella HumanResources.Employee
. Poiché il cinque percento di 290 è un valore frazionario, il valore viene arrotondato per eccesso al numero intero successivo.
Inclusione di valori di parità
A. Utilizzo di WITH TIES per includere righe che corrispondono ai valori nellultima riga
Lesempio seguente ottiene il 10
percento di tutti i dipendenti con lo stipendio più alto a nd li restituisce in ordine decrescente secondo il loro stipendio. La specifica di WITH TIES
garantisce che anche i dipendenti con stipendio uguale allo stipendio più basso restituito (lultima riga) siano inclusi nel set di risultati, anche se supera 10
percentuale dei dipendenti.
Limitazione delle righe interessate da DELETE, INSERT o UPDATE
A. Utilizzo di TOP per limitare il numero di righe eliminate
Quando si utilizza una clausola TOP (n) con DELETE, loperazione di eliminazione viene eseguita su una selezione indefinita di n numero di righe. Ovvero, listruzione DELETE sceglie qualsiasi numero (n) di righe che soddisfano i criteri definiti nella clausola WHERE.Lesempio seguente elimina 20
righe dalla tabella PurchaseOrderDetail
con date di scadenza precedenti al 1 ° luglio 2002.
Se vuoi usare TOP per eliminare le righe in un ordine cronologico significativo, usa TOP con ORDER BY in unistruzione subselect. La seguente query elimina le 10 righe della tabella PurchaseOrderDetail
con le date di scadenza più antiche. Per garantire che vengano eliminate solo 10 righe, la colonna specificata nellistruzione subselect (PurchaseOrderID
) è la chiave primaria della tabella. Lutilizzo di una colonna non chiave nellistruzione subselect può comportare leliminazione di più di 10 righe se la colonna specificata contiene valori duplicati.
B. Utilizzo di TOP per limitare il numero di righe inserite
Lesempio seguente crea la tabella EmployeeSales
e inserisce il nome e i dati di vendita dallinizio dellanno per i primi cinque dipendenti dalla tabella HumanResources.Employee
. Listruzione INSERT sceglie cinque righe qualsiasi restituite dallistruzione SELECT
che soddisfano i criteri definiti nella clausola WHERE. La clausola OUTPUT visualizza le righe inserite nella tabella EmployeeSales
. Si noti che la clausola ORDER BY nellistruzione SELECT non è utilizzata per determinare i primi cinque dipendenti.
Se si desidera utilizzare TOP per inserire righe in un ordine cronologico significativo, utilizzare TOP con ORDER BY in un istruzione subselect. Lesempio seguente mostra come eseguire questa operazione. La clausola OUTPUT mostra le righe inserite nella tabella EmployeeSales
. Si noti che i primi cinque dipendenti vengono ora inseriti in base ai risultati della clausola ORDER BY invece di righe non definite.
C. Utilizzo di TOP per limitare il numero di righe aggiornate
Il seguente esempio utilizza la clausola TOP per aggiornare le righe in una tabella. Quando si utilizza una clausola TOP (n) con UPDATE, loperazione di aggiornamento viene eseguita su un numero di righe indefinito. Ovvero, listruzione UPDATE sceglie qualsiasi numero (n) di righe che soddisfano i criteri definiti nella clausola WHERE. Lesempio seguente assegna 10 clienti da un venditore a un altro.
Se è necessario utilizzare TOP per applicare gli aggiornamenti in una cronologia significativa, è necessario utilizzare TOP insieme a ORDER BY in unistruzione subselect. Lesempio seguente aggiorna le ore di ferie dei 10 dipendenti con le prime date di assunzione.
Esempi: Azure Synapse Analytics e Parallel Data Warehouse
Lesempio seguente restituisce le prime 31 righe che corrispondono ai criteri della query. La clausola ORDER BY garantisce che le 31 righe restituite siano le prime 31 righe in base a un ordine alfabetico della colonna LastName
.
Utilizzo di TOP senza specificare i legami.
Risultato: vengono restituite 31 righe.
Utilizzo di TOP, specificando WITH TIES.
Risultato: vengono restituite 33 righe, perché tre dipendenti denominati Brown pareggiano per la 31a riga.