Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment inclure des résultats qui sont à égalité pour la dernière place lors de l'utilisation de la clause TOP dans SQL Server

Lors de l'utilisation du TOP clause dans une requête dans SQL Server, vous pouvez rencontrer des occasions où deux résultats ou plus sont à égalité pour la dernière place. Vous ne sauriez probablement même pas quand cela se produit, car le comportement par défaut de TOP est de ne pas renvoyer plus que le nombre de lignes que vous spécifiez.

Le TOP la clause accepte un WITH TIES argument qui vous permet de spécifier s'il faut ou non inclure tous les résultats ex aequo pour la dernière place. Les lignes peuvent être à égalité pour la dernière place en raison de leur ORDER BY colonne contenant la même valeur. L'utilisation de cet argument peut donc entraîner le renvoi d'un plus grand nombre de lignes que vous n'en avez réellement spécifié.

Exemple 1 - Les données

Tout d'abord, voici les données avec lesquelles nous allons travailler dans les exemples suivants :

SELECT AlbumId, AlbumName, ArtistId FROM Albums ;

Résultat :

+-----------+---------------------+------- -----+| ID d'album | NomAlbum | IdArtiste ||-----------+---------------------+-------- ----|| 1 | Powerslave | 1 || 2 | Powerage | 2 || 3 | Chanter sur la voie | 6 || 4 | Ziltoid l'Omniscient | 5 || 5 | Victimes de Cool | 5 || 6 | Épicloud | 5 || 7 | Quelque part dans le temps | 1 || 8 | Tranquillité d'esprit | 1 || 9 | Tueurs | 1 || 10 | Pas de prière pour les mourants | 1 || 11 | Pas de son sans silence | 9 || 12 | Grand visage de balançoire | 4 || 13 | Nuit Bleue | 12 || 14 | Éternité | 12 || 15 | Scandinavie | 12 || 16 | Valise perdue depuis longtemps | 7 || 17 | Louange et blâme | 7 || 18 | Le long est venu Jones | 7 || 19 | Toute la nuit est fausse | 3 || 20 | Les Seize Hommes de Tain | 3 || 21 | Yo Wassup | 9 || 22 | Cassé | 9 |+-----------+---------------------+-------- ----+

Exemple 2 - Utiliser TOP sans liens

Voici ce qui se passe si nous utilisons TOP sans en spécifiant WITH TIES . C'est ainsi que la plupart des gens utilisent cette clause.

Dans ce cas, je classe les résultats par ArtistId .

SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC ;

Résultat :

+-----------+-------------+------------+| ID d'album | NomAlbum | IdArtiste ||-----------+--------------+------------|| 1 | Powerslave | 1 || 7 | Quelque part dans le temps | 1 || 8 | Tranquillité d'esprit | 1 |+-----------+--------------+------------+ 

Comme prévu, nous obtenons trois lignes. Ce sont les trois premiers comme spécifié par le TOP clause.

Exemple 3 - Utiliser TOP avec des cravates

Maintenant pour les cravates. Voici ce qui se passe si nous ajoutons WITH TIES .

SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC ;

Résultat :

+-----------+-------------------------+-------- ----+| ID d'album | NomAlbum | IdArtiste ||-----------+-------------------------+--------- ---|| 1 | Powerslave | 1 || 7 | Quelque part dans le temps | 1 || 8 | Tranquillité d'esprit | 1 || 9 | Tueurs | 1 || 10 | Pas de prière pour les mourants | 1 |+-----------+-------------------------+--------- ---+

Nous obtenons maintenant cinq lignes au lieu de seulement trois. C'est parce qu'il y a deux autres lignes qui partagent le même ArtistId comme la troisième rangée. En d'autres termes, trois rangées étaient à égalité pour la dernière place.

Notez que dans SQL Server, l'ordre renvoyé des lignes liées est arbitraire.

Exemple 4 – Une clause ORDER BY modifiée pour éliminer les égalités

Si nous ajoutons le AlbumId colonne à ORDER BY clause, cela élimine complètement les liens.

SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC, AlbumId ASC ;

Résultat :

+-----------+-------------+------------+| ID d'album | NomAlbum | IdArtiste ||-----------+--------------+------------|| 1 | Powerslave | 1 || 7 | Quelque part dans le temps | 1 || 8 | Tranquillité d'esprit | 1 |+-----------+--------------+------------+ 

Ainsi, même lorsque nous spécifions WITH TIES , aucun n'est présent dans ce cas.

Exemple 5 – Utilisation d'une clause WHERE

Voici un dernier exemple, où j'utilise un WHERE clause pour extraire un groupe de lignes du milieu de la table. Le premier exemple est sans attaches et le second avec attaches.

Sans liens :

SELECT TOP(4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC ;

Résultat :

+-----------+-------------------------+-------- ----+| ID d'album | NomAlbum | IdArtiste ||-----------+-------------------------+--------- ---|| 19 | Toute la nuit est fausse | 3 || 20 | Les Seize Hommes de Tain | 3 || 12 | Grand visage de balançoire | 4 || 16 | Valise perdue depuis longtemps | 7 |+-----------+-------------------------+--------- ---+

Avec liens :

SELECT TOP(4) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC ;

Résultat :

+-----------+-------------------------+-------- ----+| ID d'album | NomAlbum | IdArtiste ||-----------+-------------------------+--------- ---|| 19 | Toute la nuit est fausse | 3 || 20 | Les Seize Hommes de Tain | 3 || 12 | Grand visage de balançoire | 4 || 16 | Valise perdue depuis longtemps | 7 || 17 | Louange et blâme | 7 || 18 | Le long est venu Jones | 7 |+-----------+-------------------------+--------- ---+