Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come includere i risultati che si legano all'ultimo posto quando si utilizza la clausola TOP in SQL Server

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          |
+-----------+-------------------------+------------+