Merge string algorithm for one-to-many relationship
Solution for MS SQL ver. before 2017
WITH [prepared_data]
AS (SELECT [books].[b_id],
[b_name],
[a_name]
FROM [books]
JOIN [m2m_books_authors]
ON [books].[b_id] = [m2m_books_authors].[b_id]
JOIN [authors]
ON [m2m_books_authors].[a_id] = [authors].[a_id]
)
SELECT [outer].[b_name]
AS [book],
STUFF ((SELECT ', ' + [inner].[a_name]
FROM [prepared_data] AS [inner]
WHERE [outer].[b_id] = [inner].[b_id]
ORDER BY [inner].[a_name]
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'),1, 2, '')
AS [author(s)]
FROM [prepared_data] AS [outer]
GROUP BY [outer].[b_id],
[outer].[b_name]
AS (SELECT [books].[b_id],
[b_name],
[a_name]
FROM [books]
JOIN [m2m_books_authors]
ON [books].[b_id] = [m2m_books_authors].[b_id]
JOIN [authors]
ON [m2m_books_authors].[a_id] = [authors].[a_id]
)
SELECT [outer].[b_name]
AS [book],
STUFF ((SELECT ', ' + [inner].[a_name]
FROM [prepared_data] AS [inner]
WHERE [outer].[b_id] = [inner].[b_id]
ORDER BY [inner].[a_name]
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'),1, 2, '')
AS [author(s)]
FROM [prepared_data] AS [outer]
GROUP BY [outer].[b_id],
[outer].[b_name]
For algorithm explanation, look at pages 77-79 of the book , solution 2.2.2.a
Solution for MS SQL ver. 2017 and newer
SELECT [b_name]
AS [book],
STRING_AGG([a_name], ', ') WITHIN GROUP (ORDER BY [a_name] ASC)
AS [author(s)]
FROM [books]
JOIN [m2m_books_authors]
ON [books].[b_id] = [m2m_books_authors].[b_id]
JOIN [authors]
ON [m2m_books_authors].[a_id] = [authors].[a_id]
GROUP BY [books].[b_id], [books].[b_name]
ORDER BY [books].[b_name]
AS [book],
STRING_AGG([a_name], ', ') WITHIN GROUP (ORDER BY [a_name] ASC)
AS [author(s)]
FROM [books]
JOIN [m2m_books_authors]
ON [books].[b_id] = [m2m_books_authors].[b_id]
JOIN [authors]
ON [m2m_books_authors].[a_id] = [authors].[a_id]
GROUP BY [books].[b_id], [books].[b_name]
ORDER BY [books].[b_name]
Комментарии
Отправить комментарий