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]

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]

Комментарии

Популярные сообщения из этого блога

MapBox-compatible file formats and limitations