Maison >base de données >tutoriel mysql >Comment `STUFF` et `FOR XML PATH` concatènent-ils les noms dans SQL Server pour les ID en double ?

Comment `STUFF` et `FOR XML PATH` concatènent-ils les noms dans SQL Server pour les ID en double ?

DDD
DDDoriginal
2025-01-22 22:52:14948parcourir

How Do `STUFF` and `FOR XML PATH` Concatenate Names in SQL Server for Duplicate IDs?

SQL Server : concaténation de noms pour les identifiants en double à l'aide de STUFF et FOR XML PATH

Ce guide montre comment concaténer plusieurs noms associés à des ID en double dans une table SQL Server, ce qui donne lieu à une liste de noms séparés par des virgules pour chaque ID unique. Nous y parviendrons en utilisant la puissante combinaison de STUFF et FOR XML PATH.

Scénario :

Imaginez un tableau avec des identifiants en double et les noms correspondants. L'objectif est de créer une nouvelle colonne contenant tous les noms pour chaque identifiant, soigneusement séparés par des virgules.

Solution :

La solution utilise un processus en trois étapes :

Étape 1 : Générer la chaîne XML séparée par des virgules

Le cœur de la solution réside dans l'utilisation de FOR XML PATH('') pour générer une chaîne séparée par des virgules à partir des noms.

<code class="language-sql">SELECT ',' + name
FROM temp1
FOR XML PATH('')</code>

Cela génère une chaîne XML où chaque nom est précédé d'une virgule.

Étape 2 : Supprimer la virgule de début

La chaîne XML résultante de l'étape 1 commence par une virgule inutile. STUFF supprime cela avec élégance.

<code class="language-sql">STUFF(
  (SELECT ',' + name FROM temp1 FOR XML PATH('')),
  1,
  1,
  ''
)</code>

STUFF remplace le premier caractère (la virgule de début) par une chaîne vide.

Étape 3 : Rejoindre, regrouper et résultat final

Enfin, nous combinons les étapes ci-dessus avec une clause JOIN et GROUP BY pour obtenir le résultat souhaité.

<code class="language-sql">SELECT ID,
  ConcatenatedNames = STUFF(
    (SELECT ',' + name
    FROM temp1 t1
    WHERE t1.id = t2.id
    FOR XML PATH (''))
  , 1, 1, '')
FROM temp1 t2
GROUP BY id;</code>

Cette requête joint la sous-requête (qui génère la chaîne séparée par des virgules) avec la table d'origine (temp1) basée sur ID. La clause GROUP BY garantit que la concaténation a lieu pour chaque identifiant unique. La colonne ConcatenatedNames résultante contient la liste des noms séparés par des virgules pour chaque identifiant.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn