这可能是一个非常常见的问题,但可能会有另一种扭曲。
我有两个表,我加入并希望得到第二个表的特定列的逗号分隔值
select name,(Comma seperated scores) 'Scores' from Person Inner join Score
on Person.Id=Score.PersonId
Example Output
name Scores
User1 zd,ad,cm
我已经读过它可以通过另一个函数来完成,但可能不是非常面向性能我也希望Scores字符串按升序排序。即ad,cm,zd
有没有办法通过继续只使用内连接来实现?
答案 0 :(得分:1)
尝试这样的事情:
SELECT name
,STUFF(
(SELECT ',' + score
FROM Score AS s
WHERE s.PersonId=p.PersonId
FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,1,'') AS CSV_Scores
FROM Person AS p;
查询将调用表Person
中的行,然后使用FOR XML PATH()
获取逗号分隔的字符串。 STUFF
用于删除第一个逗号。
ORDER BY Score
:DECLARE @Person TABLE(PersonID INT IDENTITY,Name VARCHAR(100));
INSERT INTO @Person VALUES('Jim'),('Jane');
DECLARE @Score TABLE(ScoreID INT IDENTITY, PersonID INT,Score VARCHAR(100));
INSERT INTO @Score VALUES(1,'ba'),(1,'db'),(1,'ac')
,(2,'ba'),(2,'ab');
SELECT name
,STUFF(
(SELECT ',' + score
FROM @Score AS s
WHERE s.PersonId=p.PersonId
ORDER BY s.Score
FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,1,'') AS CSV_Scores
FROM @Person AS p;
结果
name CSV_Scores
Jim ac,ba,db
Jane ab,ba