Comment Joindre Efficacement Plusieurs Lignes dans SQL Server en un Champ Délimité Unique

Dans la gestion de bases de données, en particulier lors de l’utilisation de bases de données relationnelles comme SQL Server, vous rencontrez souvent des scénarios où vous devez combiner plusieurs lignes en un seul champ pour une meilleure lisibilité et un traitement simplifié. Cet article de blog traitera de la manière de résoudre ce problème en utilisant les fonctions SQL Server, illustrant le résultat souhaité et des solutions efficaces pour différentes versions de SQL Server.

Déclaration du Problème

Imaginez que vous avez deux tables : Véhicules et Lieux. Voici un exemple rapide de ce à quoi ressemblent ces tables :

Table des Véhicules

VehicleID Nom
1 Chuck
2 Larry

Table des Lieux

LocationID VehicleID Ville
1 1 New York
2 1 Seattle
3 1 Vancouver
4 2 Los Angeles
5 2 Houston

L’objectif est de récupérer les données de manière à afficher le nom de chaque véhicule accompagné d’une liste de ses lieux associés. Le résultat souhaité devrait ressembler à ceci :

VehicleID Nom Lieux
1 Chuck New York, Seattle, Vancouver
2 Larry Los Angeles, Houston

Bien que vous puissiez y parvenir par le biais de requêtes complexes et de codage, nous avons besoin d’une solution qui simplifie le processus.

Solution : Utiliser les Fonctions SQL Server

Méthode 1 : Utilisation de FOR XML PATH

Si vous utilisez SQL Server 2005 ou une version ultérieure, l’une des méthodes les plus efficaces pour réaliser cette concaténation est la commande FOR XML PATH. Voici comment vous pouvez l’implémenter :

SELECT [VehicleID],
       [Nom],
       (STUFF((SELECT ', ' + [Ville] AS [text()]
                FROM [Lieux]
                WHERE (VehicleID = Véhicule.VehicleID)
                FOR XML PATH('')), 1, 2, '')) AS Lieux
FROM [Véhicule]

Explication :

  • La déclaration SELECT interne récupère les lieux pour chaque VehicleID et les concatène en une seule chaîne.
  • FOR XML PATH('') nous permet de générer une seule chaîne XML à partir des multiples lignes retournées par la sous-requête.
  • STUFF est utilisé pour supprimer la virgule et l’espace en tête de la chaîne concaténée.

Méthode 2 : Utilisation de STRING_AGG (SQL Server 2017 et versions ultérieures)

Pour ceux qui utilisent SQL Server 2017 ou plus récent, il existe un moyen encore plus simple d’y parvenir en utilisant la fonction STRING_AGG. Voici à quoi cela ressemble :

SELECT [VehicleID],
       [Nom],
       (SELECT STRING_AGG([Ville], ', ')
        FROM [Lieux]
        WHERE VehicleID = V.VehicleID) AS Lieux
FROM [Véhicule] V

Explication :

  • STRING_AGG prend deux arguments : la colonne que vous souhaitez agréger et le délimiteur avec lequel vous souhaitez séparer les entrées. C’est beaucoup plus clair et efficace que la méthode précédente.

Conclusion

Combiner plusieurs lignes en un seul champ délimité dans SQL Server peut considérablement améliorer la lisibilité et l’accessibilité de vos données. Que vous soyez sur une version plus ancienne et utilisiez FOR XML PATH ou que vous puissiez utiliser STRING_AGG dans les versions plus récentes, SQL Server vous fournit les outils nécessaires pour gérer efficacement vos données.

En comprenant ces techniques, vous pouvez simplifier vos requêtes SQL, les rendant plus faciles à lire, à maintenir et à modifier à l’avenir. Choisissez toujours la méthode qui convient le mieux à votre version de SQL Server et à vos besoins spécifiques.

Si vous avez des questions ou avez besoin de plus de clarifications sur ces méthodes, n’hésitez pas à demander dans les commentaires ci-dessous !