TOP (Transact-SQL)

Specifica che verrà restituito solo il primo set di righe del risultato della query. Il set di righe può essere specificato come numero o come percentuale di righe. L'espressione TOP può essere utilizzata in istruzioni SELECT, INSERT, UPDATE, MERGE e DELETE.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

[ 
     TOP (expression) [PERCENT]
     [ WITH TIES ]
]

Argomenti

  • expression
    Espressione numerica che specifica il numero di righe da restituire. Se viene specificato PERCENT, expression viene convertito in modo implicito in un valore float. In caso contrario, viene convertito in un valore bigint.

    Le parentesi che delimitano l'argomento expression nell'espressione TOP sono necessarie all'interno di istruzioni INSERT, UPDATE, MERGE e DELETE. L'utilizzo di TOP expression senza parentesi all'interno di istruzioni SELECT è supportato per motivi di compatibilità con le versioni precedenti, ma non è consigliato.

    Se la query include una clausola ORDER BY, vengono restituite le prime righe corrispondenti al numero specificato in expression oppure alla percentuale specificata in expression, ordinate in base alla clausola ORDER BY. Se la query non include una clausola ORDER BY, l'ordine delle righe è arbitrario.

  • PERCENT
    Indica che la query restituisce solo le prime righe del set di risultati corrispondenti alla percentuale specificata in expression.

  • WITH TIES
    Specifica che devono essere restituite alcune righe aggiuntive del set di risultati di base, ovvero le righe che presentano lo stesso valore nelle colonne ORDER BY dell'ultima delle righe restituite da TOP n (PERCENT). È possibile specificare TOP...WITH TIES solo in istruzioni SELECT e solo se viene specificata una clausola ORDER BY.

    [!NOTA]

    L'ordine restituito per l'associazione di record è arbitrario. ORDER BY non influisce su questa regola.

Osservazioni

L'espressione TOP non può essere utilizzata insieme a istruzioni UPDATE e DELETE in viste partizionate.

Le righe cui viene fatto riferimento nell'espressione TOP utilizzata con INSERT, UPDATE, MERGE o DELETE non sono ordinate. TOP n restituisce un numero n di righe casuali. L'istruzione INSERT seguente contiene ad esempio la clausola ORDER BY, che tuttavia non influisce sulle righe a cui viene fatto direttamente riferimento nell'istruzione INSERT.

INSERT TOP (2) INTO Table2 (ColumnB) 
    SELECT ColumnA FROM Table1 
    ORDER BY ColumnA;

La clausola ORDER BY della query precedente fa riferimento solo alle righe restituite dall'istruzione SELECT nidificata. L'istruzione INSERT sceglie due righe qualsiasi tra quelle restituite dall'istruzione SELECT. Per garantire l'inserimento delle prime due righe della sottoquery SELECT, riscrivere la query come illustrato di seguito.

INSERT INTO Table2 (ColumnB) 
    SELECT TOP (2) ColumnA FROM Table1 
    ORDER BY ColumnA;

SQL Server consente di aggiornare viste create con la clausola TOP. Poiché la clausola TOP è inclusa nella definizione della vista, è possibile che alcune righe scompaiano dalla vista in seguito a un aggiornamento se il risultato non soddisfa più i requisiti dell'espressione TOP. Per ulteriori informazioni, vedere Modifica di dati tramite una vista.

Un'espressione TOP utilizzata in una query non ha effetto sulle istruzioni eventualmente eseguite a causa dell'attivazione di un trigger. Nelle tabelle inserite e aggiornate nei trigger verranno indicate solo le righe su cui l'istruzione INSERT, UPDATE, MERGE o DELETE ha effetto.

Utilizzo di TOP nell'istruzione MERGE

Quando viene specificata nell'istruzione MERGE, la clausola TOP viene applicata dopo l'unione in join dell'intera tabella di origine e dell'intera tabella di destinazione e dopo la rimozione delle righe non qualificate per un'azione di inserimento, aggiornamento o eliminazione. La clausola TOP riduce ulteriormente il numero di righe unite in join in base al valore specificato e l'azione di inserimento, aggiornamento o eliminazione viene applicata alle righe unite in join rimanenti in modo non ordinato. Questo significa che le righe vengono distribuite tra le azioni definite nelle clausole WHEN senza alcun ordine. La specifica della clausola TOP (10), ad esempio, influisce su 10 righe, 7 delle quali possono essere aggiornate e 3 inserite oppure 1 riga può essere eliminata, 5 aggiornate e 4 inserite e così via.

Poiché l'istruzione MERGE esegue una scansione completa di entrambe le tabelle di origine e di destinazione, l'utilizzo della clausola TOP per modificare una tabella di grandi dimensioni creando più batch può influire sulle prestazioni di I/O. In questo scenario è importante garantire che tutti i batch successivi vengano destinati alle nuove righe. Per ulteriori informazioni, vedere Ottimizzazione delle prestazioni delle istruzioni MERGE.

Esempi

A. Utilizzo di TOP con variabili

Nell'esempio seguente viene utilizzata una variabile per ottenere i primi 10 dipendenti elencati nella tabella dbo.Employee del database AdventureWorks.

USE AdventureWorks;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO

B. Utilizzo di TOP con PERCENT e WITH TIES

Nell'esempio seguente viene restituito il 10% di tutti i dipendenti che percepiscono lo stipendio più alto, in ordine decrescente in base alla retribuzione base. L'opzione WITH TIES garantisce che nel set di risultati vengano inclusi anche tutti i dipendenti con uno stipendio pari allo stipendio più basso restituito, anche se in tal caso il set restituito supererà il 10% dei dipendenti.

USE AdventureWorks;
GO
SELECT TOP(10) PERCENT WITH TIES
c.FirstName, c.LastName, e.Title, e.Gender, r.Rate
FROM Person.Contact AS c 
    INNER JOIN HumanResources.Employee AS e
        ON c.ContactID = e.ContactID
    INNER JOIN HumanResources.EmployeePayHistory AS r
        ON r.EmployeeID = e.EmployeeID
ORDER BY Rate DESC;