2011-10-21 32 views
3

我已经搜索了很多线程,网站和博客以及API,并且似乎无法找出这个问题。我想从联结表中的行创建一个CSV字符串,但这里有一个问题。它需要用于整套数据。我知道,令人困惑,这是故障。从连接表内部查询(SQL Server)中逗号分隔的字符串

让我们使用与下表中的一般示例:

  • 学生(ID,姓名,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语句像下面这样,但我不能让它因为聚结愚蠢的语法的工作。有没有更好的方法来实现这个目标,或者我只是在做一个哑语句错误?

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) 

回答

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/

+2

哇靠。测试过,效果很好。 +1 =) – jadarnel27

+0

@Mikael:我得到了'1,2,3,4,5,6,7,8,9'三个类的每一个与您的代码:( – Chiramisu

+1

@Chiramisu - 你可以添加数据你在你的表格中有你的问题,我想在StudentInClass和Class之间的连接有问题,或者你忘记了子查询中where子句where C.ClassID = C.ID' –

相关问题