Dans SQL, l'option WITH TIES est utilisée avec ORDER BY et la construction de limitation du nombre de lignes (TOP ou FETCH FIRST ... ROWS ONLY). Elle permet de retourner non seulement les N premières lignes, mais aussi toutes les lignes dont les valeurs dans le champ de tri correspondent à la dernière ligne (la N-ième).
Quand cela est-il nécessaire : lors de l'analyse, des classements, des tableaux de leaders, quand il est important d'inclure des "ex-aequos" ou des groupes ayant le même classement.
Exemple (SQL Server) :
SELECT TOP 3 WITH TIES * FROM Sales ORDER BY Amount DESC;
Si la 3ème et la 4ème place ont la même somme de ventes, les deux lignes seront retournées.
Dans PostgreSQL :
SELECT * FROM Sales ORDER BY Amount DESC FETCH FIRST 3 ROWS WITH TIES;
Important : cela ne fonctionnera qu'avec ORDER BY, sinon le résultat sera imprévisible.
Quelle est la différence entre juste
TOP N/LIMITet l'utilisation deWITH TIES?
Réponse fausse fréquente: "WITH TIES limite simplement les lignes, c'est un synonyme".
Réponse correcte :
TOP N/LIMIT — retournera exactement N lignes, même si les suivantes ont la même valeur de tri.WITH TIES — ajoutera toutes les lignes dont le champ de tri correspond à la dernière (N-ième).Exemple :
-- Sélectionner les 2 meilleurs résultats, mais si un "ex-aequo" existe — obtenir aussi ceux-ci : SELECT TOP 2 WITH TIES Name, Score FROM Results ORDER BY Score DESC;
Histoire
Projet : Compétition de classements étudiants. Erreur : Utilisé simplement
LIMIT 3, et plusieurs étudiants ayant le même score ont été exclus de la liste des gagnants — des vrais gagnants ont été erronément "coupés".
Histoire
Projet : Analyse e-commerce. Erreur : Voulu montrer le top-5 des produits les plus populaires, mais en ayant le même SKU en ventes, seuls les 5 premiers ont été montrés, et plus tard lors d'un audit, il a été remarqué qu'une partie des hits n'était pas dans le rapport.
Histoire
Projet : Reporting des ventes des filiales. Erreur : Le client s'attendait à voir tous les leaders avec le même résultat, mais le développeur ne connaissait pas
WITH TIES— les résultats étaient incorrects, le client a déposé une plainte sur la qualité des données.