APSQL

Comprendre la clause TOP

La clause TOP est une option de l'instruction SELECT et permet de limiter le nombre de lignes dans le jeu de résultat. Cette clause peut s'avérer particulièrement utile.

La clause TOP permet de ramener soit un nombre de lignes précis soit un pourcentage de lignes. Malgré les indications données lors de définition de cette clause les résultats peuvent légèrement varier.

Pour comprendre ce qui se passe nous allons travailler avec une table d'exemple très simple:

create table articles (refart nchar(8), designation nvarchar(120), prix numeric(10,2));
			

Les données sont ajoutées à l'aide de la requête suivante (syntaxe possible à partir de SQL Server 2008)

insert into articles values ('VH','Velo Homme',200), ('VF','Velo Femme',150), ('VE','Velo Enfant',100);
insert into articles values ('CH','Casque Homme',20), ('CF','Casque Femme',15), ('CE','Casque Enfant',10);
insert into articles values ('CA','Casque Fantaise',20);
			

Cas n°1 – 3 lignes

Dans un premier temps nous souhaitons extraire simplement 3 lignes de la table, pour cela nous exécutons la requête

select top 3 * from articles;
			

Le résultat est conforme à nos attentes et 3 lignes sont extraites de la table.

Cas n°2 – 3 lignes avec tri

Dans un second temps nous souhaitons connaître les 3 articles les moins chers. Pour cela nous exécutons la requête

select top 3 * from articles order by prix asc;
			

Le problème qui se pose (et aucune message ne vous donne d'avertissement) c'est qu'il existe 2 produits au même tarif. Pour incluse les produits avec des tarifs identique (et donc faire apparaître les ex aequo) il est nécessaire d'utiliser l'option WITH TIES et donc d'exécuter la requête suivante:

select top 3 with ties * from articles order by prix asc
			

Comme toutes les lignes retournée comptent dans la clause TOP le résultat identique sera obtenu avec la requête

select top 4 with ties * from articles order by prix asc;
			

L'écriture de cette dernière requête permet donc de comprendre que la clause TOP 4 WITH TIES permet d'extraire au moins 4 lignes et plus en cas d'égalité au dernier rang.

Cas n°3 – Pourcentage

Pour l'extraction d'un pourcentage TOP arrondi toujours au nombre de lignes strictement supérieur, en effet SQL ne permet pas d'extraire la moitié d'une ligne par exemple. Donc dans le cas présent comme la table articles contient 7 lignes, la clause TOP 50 PERCENT va retourner 4 lignes (4 étant le premier nombre entier supérieur à la moitié de 7 ie 3,5).

select top 50 PERCENT * from articles;
			

Il est également possible d'utiliser WITH TIES pour étendre le jeu de résultat en cas d'égalité.