Problema:
Vuoi limitare le righe in un set di risultati di SQL Server.
Esempio:
Il nostro database ha una tabella chiamata toy
con i dati nelle colonne id
, name
e price
.
id | prezzo | |
---|---|---|
161 | Bicicletta BMX | 200.00 |
121 | Il robot Tobie | 185.50 |
213 | Gioco di pesca | 25.00 |
102 | Enigmi di animali | 45.80 |
111 | Set di piste | 126,70 |
233 | Mattoni facili | 21:00 |
Selezioniamo i nomi e i prezzi dei giocattoli. Ma abbiamo solo bisogno di vedere le prime cinque righe.
Soluzione 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Ecco il risultato della query:
nome | prezzo |
---|---|
Mattoni facili | 21:00 |
Gioco di pesca | 25.00 |
Enigmi di animali | 45.80 |
Set di piste | 126,70 |
Il robot Tobie | 185.50 |
Discussione:
Per limitare le righe nel set di risultati, utilizzare ORDER BY con le clausole OFFSET e FETCH facoltative. Innanzitutto, la query ordina le righe (ORDER BY). Quindi dici a SQL Server quale dovrebbe essere la prima riga nel set di risultati (OFFSET...ROWS) e quante righe restituire (FETCH...ONLY).
La clausola OFFSET è inserita immediatamente dopo ORDER BY. Il numero intero indica la prima riga da contare (in SQL Server, la prima riga è 0, la seconda riga è 1 e così via), seguita dalla parola chiave ROW o ROWS. È possibile utilizzare ROW o ROWS, ma si consiglia di utilizzare ROW per 1 riga e ROWS per 0 e più righe. Guarda l'immagine:
Nel nostro esempio, ordiniamo per prezzo (ORDER BY price
) e inizia a restituire i risultati dalla prima riga (OFFSET 0 ROWS
). Quindi utilizziamo FETCH con la parola chiave FIRST. Puoi usare FIRST o NEXT; si consiglia di utilizzare FIRST se si parte dalla prima riga senza omettere alcun record e NEXT se vengono omesse righe (cioè se OFFSET è maggiore di 0).
Infine, abbiamo il numero di righe da selezionare e la parola chiave SOLO RIGHE. Usa SOLO RIGHE se stai restituendo più righe e SOLO RIGHE stai limitando il risultato a una riga. Nel nostro esempio, lo limitiamo a cinque righe (FETCH FIRST 5 ROWS ONLY
).
Di seguito, abbiamo un'altra query che limita le righe a cinque ma inizia dalla quinta riga nella tabella (OFFSET 4 ROWS
):
Soluzione 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Ecco il risultato della query:
nome | prezzo |
---|---|
Il Robot Tobie | 185.50 |
Bicicletta BMX | 200.00 |
Si noti che questa query restituisce solo due righe, non le cinque indicate. Guarda l'immagine:
Perché solo due righe? Perché questa tabella contiene solo sei record. Se omettiamo le prime quattro righe e iniziamo dalla riga 5, rimangono solo due righe.
SQL Server ha un altro modo per limitare le righe:la clausola TOP.
Soluzione 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Ecco il risultato della query:
nome | prezzo |
---|---|
Mattoni facili | 21:00 |
Gioco di pesca | 25.00 |
Enigmi di animali | 45.80 |
Se non è necessario omettere alcuna riga, è possibile utilizzare la clausola TOP di SQL Server per limitare le righe restituite. Viene posizionato immediatamente dopo SELECT. La parola chiave TOP è seguita da un numero intero che indica il numero di righe da restituire. Nel nostro esempio, abbiamo ordinato per prezzo e quindi limitato le righe restituite a 3.
A differenza del metodo OFFSET – FETCH, TOP non richiede ORDER BY. Ecco un esempio simile, ma senza ordinare i record:
Soluzione 4:
SELECT TOP 3 name, price FROM toy;
Ecco il risultato della query:
Si noti che sono stati restituiti record diversi. Di solito (ma non sempre) le righe vengono visualizzate nell'ordine in cui i record sono stati inseriti nella tabella.
Si consiglia di utilizzare OFFSET e FETCH invece di TOP, poiché OFFSET e FETCH sono standard SQL; TOP è specifico per T-SQL.