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

Sélectionner en arrière une liste délimitée par des virgules regroupée par un ID

select ET1.EntryID,
       (
       select ', '+T.Name
       from Tags as T
         inner join EntryTag as ET2
           on T.TagID = ET2.TagID
       where ET1.EntryID = ET2.EntryID
       for xml path(''), type
       ).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID

Disséquer la requête

La requête principale fait un group by vous n'obtenez donc qu'une seule ligne pour chaque EntryID .

La colonne TagsCommaDelimited est créé avec une sous-requête corrélée.

Dans SQL Server for xml path est utilisé pour créer une représentation XML d'un résultat de requête. Vous avez un bon contrôle sur la façon dont le XML est créé en utilisant des alias de colonne et les paramètres de path et root .

La valeur concaténée ', '+T.Name dans la sous-requête corrélée n'aura pas de nom de colonne et le paramètre vide à for xml path('') crée le xml sans aucune balise. Il n'y aura qu'une seule valeur de texte renvoyée.

Lorsque vous ajoutez type à un for xml requête le type de données sera XML .

Pour obtenir une valeur à partir d'un XML, vous devez utiliser la valeur value() méthode. Vous pouvez convertir une chaîne, mais si vous le faites, vous obtiendrez par exemple & dans la chaîne où vous avez utilisé & .

Le premier paramètre dans le value() function est l'expression xQuery utilisée pour obtenir la valeur souhaitée. Utilisez text() pour spécifier que vous ne voulez que la valeur de l'élément actuel. [1] indique à SQL Server que vous voulez que le premier nœud de texte soit trouvé (vous n'en avez qu'un ici) mais il est toujours nécessaire.

La chaîne créée par le for xml query a une virgule supplémentaire et un espace au début de la chaîne et cela doit être supprimé. Ici, j'utilise la fonction XQuery substring pour obtenir tout sauf les deux premiers caractères.

Le deuxième paramètre de value() spécifie le type de données qui doit être renvoyé.