如果您使用的是SQL Server 2017或Azure,请参阅Mathieu Renda的答案。
当我尝试将两个具有一对多关系的表联接在一起时,我遇到了类似的问题。在SQL 2005中,我发现该XML PATH方法可以非常轻松地处理行的串联。
如果有一个表叫做 STUDENTS
SubjectID StudentName---------- -------------1 Mary1 John1 Sam2 Alaina2 Edward
我预期的结果是:
SubjectID StudentName---------- -------------1 Mary, John, Sam2 Alaina, Edward
我使用了以下内容T-SQL:
SELECt Main.SubjectID, LEFt(Main.Students,Len(Main.Students)-1) As "Students"FROM ( SELECt DISTINCT ST2.SubjectID, ( SELECT ST1.StudentName + ',' AS [text()] FROM dbo.Students ST1 WHERe ST1.SubjectID = ST2.SubjectID ORDER BY ST1.SubjectID FOR XML PATH ('') ) [Students] FROM dbo.Students ST2 ) [Main]如果可以在开头合并逗号并用于substring跳过第一个逗号,则可以以更紧凑的方式执行相同的操作,因此您无需执行子查询:
SELECt DISTINCT ST2.SubjectID, SUBSTRINg( ( SELECT ','+ST1.StudentName AS [text()] FROM dbo.Students ST1 WHERe ST1.SubjectID = ST2.SubjectID ORDER BY ST1.SubjectID FOR XML PATH ('') ), 2, 1000) [Students]FROM dbo.Students ST2


