Quando si utilizza il TOP
clausola in una query in SQL Server, è possibile che si verifichino occasioni in cui due o più risultati si legano all'ultimo posto. Probabilmente non sapresti nemmeno quando ciò accade, perché il comportamento predefinito di TOP
è restituire non più del numero di righe specificato.
Il TOP
la clausola accetta un WITH TIES
argomento che consente di specificare se includere o meno tutti i risultati che si legano all'ultimo posto. Le righe possono pareggiare per l'ultimo posto a causa del loro ORDER BY
colonna contenente lo stesso valore. L'utilizzo di questo argomento può quindi comportare la restituzione di più righe di quelle effettivamente specificate.
Esempio 1 – I dati
Innanzitutto, ecco i dati con cui lavoreremo nei seguenti esempi:
SELECT AlbumId, AlbumName, ArtistId FROM Albums;
Risultato:
+-----------+--------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+--------------------------+------------| | 1 | Powerslave | 1 | | 2 | Powerage | 2 | | 3 | Singing Down the Lane | 6 | | 4 | Ziltoid the Omniscient | 5 | | 5 | Casualties of Cool | 5 | | 6 | Epicloud | 5 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | | 9 | Killers | 1 | | 10 | No Prayer for the Dying | 1 | | 11 | No Sound Without Silence | 9 | | 12 | Big Swing Face | 4 | | 13 | Blue Night | 12 | | 14 | Eternity | 12 | | 15 | Scandinavia | 12 | | 16 | Long Lost Suitcase | 7 | | 17 | Praise and Blame | 7 | | 18 | Along Came Jones | 7 | | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 21 | Yo Wassup | 9 | | 22 | Busted | 9 | +-----------+--------------------------+------------+
Esempio 2 – Usa TOP senza legami
Ecco cosa succede se utilizziamo TOP
senza specificando WITH TIES
. Questo è il modo in cui la maggior parte delle persone usa questa clausola.
In questo caso, ordino i risultati per ArtistId
.
SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC;
Risultato:
+-----------+-------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | +-----------+-------------------+------------+
Come previsto, otteniamo tre righe. Questi sono i primi tre come specificato da TOP
clausola.
Esempio 3:utilizzare TOP con cravatte
Ora per le cravatte. Ecco cosa succede se aggiungiamo WITH TIES
.
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC;
Risultato:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | | 9 | Killers | 1 | | 10 | No Prayer for the Dying | 1 | +-----------+-------------------------+------------+
Ora otteniamo cinque righe anziché solo tre. Questo perché ci sono altre due righe che condividono lo stesso ArtistId
come terza fila. In altre parole, tre file erano in parità per l'ultimo posto.
Si noti che in SQL Server l'ordine restituito per legare le righe è arbitrario.
Esempio 4:una clausola ORDER BY modificata per eliminare i pareggi
Se aggiungiamo il AlbumId
nella colonna ORDER BY
clausola, questo elimina del tutto i legami.
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC, AlbumId ASC;
Risultato:
+-----------+-------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | +-----------+-------------------+------------+
Quindi anche quando specifichiamo WITH TIES
, nessuno è presente in questo caso.
Esempio 5 – Utilizzo di una clausola WHERE
Ecco un ultimo esempio, in cui utilizzo un WHERE
clausola per estrarre un gruppo di righe dal centro della tabella. Il primo esempio è senza pareggi e il secondo è con pareggi.
Senza legami:
SELECT TOP(4) AlbumId, AlbumName, ArtistId FROM Albums WHERE AlbumId > 10 ORDER BY ArtistId ASC;
Risultato:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 12 | Big Swing Face | 4 | | 16 | Long Lost Suitcase | 7 | +-----------+-------------------------+------------+
Con cravatte:
SELECT TOP(4) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums WHERE AlbumId > 10 ORDER BY ArtistId ASC;
Risultato:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 12 | Big Swing Face | 4 | | 16 | Long Lost Suitcase | 7 | | 17 | Praise and Blame | 7 | | 18 | Along Came Jones | 7 | +-----------+-------------------------+------------+