Nếu bạn đang sử dụng SQL Server 2017 hoặc Azure, hãy xem câu trả lời Mathieu Renda.
Tôi đã gặp sự cố tương tự khi tôi đang cố gắng tham gia hai bảng với các mối quan hệ một-nhiều. Trong SQL 2005, tôi thấy rằng XML PATH
phương thức có thể xử lý việc nối các hàng rất dễ dàng.
Nếu có một bảng được gọi là STUDENTS
SubjectID StudentName
---------- -------------
1 Mary
1 John
1 Sam
2 Alaina
2 Edward
Kết quả tôi mong đợi là:
SubjectID StudentName
---------- -------------
1 Mary, John, Sam
2 Alaina, Edward
Tôi đã sử dụng T-SQL
sau :
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]
Bạn có thể làm điều tương tự theo cách nhỏ gọn hơn nếu bạn có thể nối các dấu phẩy ở đầu và sử dụng substring
bỏ qua câu hỏi đầu tiên, do đó bạn không cần thực hiện một truy vấn phụ:
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