我正在研究一个查询,它应该给我这样的结果:
|--Name--|--Surname--|--Language--|--Date-- | | James | Hetfield | en,gb,fr | 2011-01-01| | Lars | Ulrich | gb,fr,ca | 2011-01-01|
但是我的选择得到了像这样的行集:
| James | Hetfield | en | 2011-01-01| | James | Hetfield | gb | 2011-01-01| | James | Hetfield | fr | 2011-01-01| | Lars | Ulrich | gb | 2011-01-01| | Lars | Ulrich | fr | 2011-01-01| | Lars | Ulrich | ca | 2011-01-01|
您建议使用哪种最佳方法将结果集转换为“即时”分组列中的逗号分隔值?我发现CROSS APPLY可以完成这项工作,但是人们说这种方法非常耗时。另外,DB具有大量数据。
在此先感谢,问候,阿德里安
这是最好的串联方法,它不会像其他XML方法一样扩展特殊字符:
--Concatenation with FOR XML & eliminating control/encoded char expansion "& < >" set nocount on; declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5)) insert into @YourTable VALUES (1,1,'CCC') insert into @YourTable VALUES (2,2,'B<&>B') insert into @YourTable VALUES (3,2,'AAA') insert into @YourTable VALUES (4,3,'<br>') insert into @YourTable VALUES (5,3,'A & Z') set nocount off SELECT t1.HeaderValue ,STUFF( (SELECT ', ' + t2.ChildValue FROM @YourTable t2 WHERE t1.HeaderValue=t2.HeaderValue ORDER BY t2.ChildValue FOR XML PATH(''), TYPE ).value('.','varchar(max)') ,1,2, '' ) AS ChildValues FROM @YourTable t1 GROUP BY t1.HeaderValue
输出:
HeaderValue ChildValues ----------- --------------- 1 CCC 2 AAA, B<&>B 3 <br>, A & Z (3 row(s) affected)