2011-10-21 62 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' –

相關問題