Chaîne concat sur MS SQL pour un groupe de lignes

Disons que j'ai 2 tables:

1 avec les users et un autre qui conserve l'logging de quels users ont utilisé quels codes.

 Utilisateurs
 -----
 Id, Nom
 1, 'John'
 2, 'Doe'

 Codes
 ------
 Id, UserId, code
 1, 1, 145
 2, 1, 187
 3, 2, 251

Maintenant, je veux tirer une requête qui résulte qu'il suit

 Nom, UsedCodes
 'John', '145 187'
 'Doe', '251'

Comment cela peut-il être fait avec une requête ou une procédure stockée?

Puisque vous n'avez pas spécifié le DB, je vous donne deux options:

MySql

Avec MySql, vous devez simplement utiliser la fonction d'agrégation GROUP_CONCAT() .

Microsoft SQL Server 2005+

Évidemment, le moyen le plus rapide (pas de sliders, pas de coalescence …) d'get le même résultat sur MS DB est d'utiliser FOR XML PATH('') qui omet simplement les éléments XML.

 SELECT u.Name, c1.UserId, ( SELECT c2.Code + ',' FROM Codes c2 WHERE c2.UserId = c1.UserId ORDER BY c2.code FOR XML PATH('') ) as Codes FROM Codes c1 JOIN Users u ON (u.Id = c1.UserId) GROUP BY c1.UserId, u.Name 

D'autres alternatives

Lisez cet article , qui explique tous les moyens possibles pour atteindre cet objective.

Pour SQL Server comme un très rapide et sale, vous pouvez utiliser une fonction SQL et un slider. Je ne reorderais pas vraiment cela pour une utilisation élevée et je serais vraiment embarassé quand quelqu'un pointe un exemple beaucoup plus facile qui n'a pas besoin d'une fonction et encore less un slider.

 SELECT t1.Name, SsortingngDelimitCodes(t1.ID) as 'UsedCodes' FROM users t1 

Et la fonction serait quelque chose comme

 function SsortingngDelimitCodes(@ID INT) VARCHAR(255) AS BEGIN DECLARE CURSOR myCur AS SELECT Code FROM Codes WHERE ID UserID = @ID OPEN myCur DECLARE @ssortingng VARCHAR(255) FETCH @MyCode = Code FROM myCur WHILE @@FetchStatus ==0 BEGIN IF(@ssortingng <> '') BEGIN SELECT @Ssortingng = @Ssortingng + ',' END SELECT @Ssortingng = @Ssortingng + CAST(@CODE AS VARCHAR(10)) FETCH @MyCode = Code FROM myCur END CLOSE myCur DEALLOCATE myCUR RETURN @ssortingng END 

EDIT: Désolé pour toutes les erreurs de syntaxe SQL, n'ont pas SQL installé ici pour valider, etc. ainsi fait de la memory.