在SQL Server

时间:2017-07-03 14:12:34

标签: sql sql-server

这可能是一个非常常见的问题,但可能会有另一种扭曲。

我有两个表,我加入并希望得到第二个表的特定列的逗号分隔值

  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

有没有办法通过继续只使用内连接来实现?

1 个答案:

答案 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