连接表内部查询的逗号分隔字符串(SQL Server)

时间:2011-10-21 19:35:31

标签: sql-server csv coalesce

我搜索了很多线程,网站和博客,以及API,似乎无法想出这一点。我想从联结表中的行创建一个CSV字符串,但这里是catch。它需要是一整套数据。我知道,令人困惑,这是故障。

让我们将通用示例与下表一起使用:

  • 学生(身份证,姓名,Gpa)
  • 课程(ID,部门,级别)
  • StudentsInClasses(StudentID,ClassID)

假设我想查询所有类,但在该查询中(对于每个记录)我还希望在每个类中获得学生ID的CSV字符串。结果看起来应该是这样的:

Class      StudentsID_CSVString
-----      --------------------
BA302      1,2,3,4,5,6,7,8,9
BA479      4,7,9,12,15
BA483      7,9,12,18

我尝试使用如下所示的coalesce语句,但由于coalesce的愚蠢语法,我无法使其工作。有没有更好的方法来实现这个目标,还是我只是犯了一个愚蠢的语法错误?

declare @StudentsID_CSVString varchar(128)
select Dept + Level as 'Class',
    coalesce(@StudentsID_CSVString + ',', '')
        + CAST(StudentID as varchar(8)) as 'StudentsID_CSVString'
from Classes
    left outer join StudentsInClasses ON Classes.ID = StudentsInClasses.ClassID

我使用以下代码进行测试:

declare @Students table (ID int, Name varchar(50), Gpa decimal(3,2))
declare @Classes table (ID int, Dept varchar(4), [Level] varchar(3))
declare @StudentsInClasses table (StudentID int, ClassID int)
declare @StudentsID_CSVString varchar(128)

insert into @Students (ID) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18)
insert into @Classes (ID, Dept, [Level]) values (1, 'BA', '302'), (2, 'BA', '379'), (3, 'BA', '483')
insert into @StudentsInClasses (StudentID, ClassID) values
    (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),
    (4,2),(7,2),(9,2),(12,2),(15,2),
    (7,3),(9,3),(12,3),(18,3)

1 个答案:

答案 0 :(得分:4)

使用逗号分隔字符串填充变量@StudentsID_CSVString的技术,您将只能一次获取一个类的字符串。要在结果集中获得多个类,可以使用for xml path

select C.Dept+C.Level as Class,
       stuff((select ','+cast(S.StudentID as varchar(10)) 
              from StudentsInClasses as S
              where S.ClassID = C.ID
              for xml path('')), 1, 1, '') as StudentsID_CSVString
from Classes as C

在此处测试查询:http://data.stackexchange.com/stackoverflow/q/115573/