Regrouper les champs de plusieurs enregistrements par un autre champ en T-SQL
Cet article explorera une technique de regroupement des valeurs de champs associées à plusieurs enregistrements dans deux tables. En combinant les données des tables Reviews, Reviewers et Users, nous pouvons concaténer les champs FName en une chaîne séparée par des virgules.
<code class="language-sql">-- 示例数据 DECLARE @Reviews TABLE( ReviewID INT, ReviewDate DATETIME ) DECLARE @Reviewers TABLE( ReviewerID INT, ReviewID INT, UserID INT ) DECLARE @Users TABLE( UserID INT, FName VARCHAR(50), LName VARCHAR(50) ) INSERT INTO @Reviews SELECT 1, '12 Jan 2009' INSERT INTO @Reviews SELECT 2, '25 Jan 2009' INSERT INTO @Users SELECT 1, 'Bob', '' INSERT INTO @Users SELECT 2, 'Joe', '' INSERT INTO @Users SELECT 3, 'Frank', '' INSERT INTO @Users SELECT 4, 'Sue', '' INSERT INTO @Users SELECT 5, 'Alice', '' INSERT INTO @Reviewers SELECT 1, 1, 1 INSERT INTO @Reviewers SELECT 2, 1, 2 INSERT INTO @Reviewers SELECT 3, 1, 3 INSERT INTO @Reviewers SELECT 4, 2, 4 INSERT INTO @Reviewers SELECT 5, 2, 5</code>
Solution utilisant SELECT et FOR XML PATH()
En utilisant l'opérateur FOR XML PATH(), nous pouvons concaténer les valeurs FName en une seule chaîne :
<code class="language-sql">SELECT *, ( SELECT u.FName + ',' FROM @Users u INNER JOIN @Reviewers rs ON u.UserID = rs.UserID WHERE rs.ReviewID = r.ReviewID FOR XML PATH('') ) AS UserNames FROM @Reviews r</code>
Cette requête renvoie les résultats suivants :
<code>ReviewID ReviewDate UserNames 1 12 Jan 2009 Bob,Joe,Frank 2 25 Jan 2009 Sue,Alice</code>
Conclusion
À l'aide de la fonction FOR XML PATH(), nous avons réussi à regrouper les valeurs de champ de plusieurs enregistrements dans différentes tables par un champ commun. Cette technique peut être appliquée aux scénarios dans lesquels des représentations sous forme de chaînes concaténées sont requises.
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!