Se você estiver no SQL Server 2017 ou no Azure, confira a resposta de Mathieu Renda.
Eu tive um problema semelhante ao tentar unir duas tabelas com relacionamentos um para muitos. No SQL 2005, descobri que
XML PATH
O método pode lidar com a concatenação das linhas com muita facilidade. Se houver uma tabela chamada
STUDENTS
SubjectID StudentName
---------- -------------
1 Mary
1 John
1 Sam
2 Alaina
2 Edward
Resultado que eu esperava era:
SubjectID StudentName
---------- -------------
1 Mary, John, Sam
2 Alaina, Edward
Eu usei o seguinte
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]
Você pode fazer a mesma coisa de uma maneira mais compacta se puder concatenar as vírgulas no início e usar
substring
para pular a primeira para não precisar fazer uma subconsulta: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