Конкатенация строк одним запросом в Transact-SQL

Периодически возникает задача отображения форматированного списка строк из зависимой таблицы в результирующем множестве из исходной таблицы. Конечно можно завести переменную и простым запросом произвести конкатенацию, но часто бывает, что нужно произвести конкатенацию внутри большого запроса без процедурного процедурного программирования. И тогда на помощь приходит встроенная в SQL Server поддержка XML.


-- Исходная таблица
DECLARE @a TABLE (id int)

INSERT INTO @a (id) VALUES (1)
INSERT INTO @a (id) VALUES (2)
INSERT INTO @a (id) VALUES (3)

-- Таблица данных
DECLARE @b TABLE (id int, txt varchar(50))
 
INSERT INTO @b (id, txt) VALUES (1, 'A')
INSERT INTO @b (id, txt) VALUES (1, 'B')
INSERT INTO @b (id, txt) VALUES (1, 'C')

INSERT INTO @b (id, txt) VALUES (2, 'D')
INSERT INTO @b (id, txt) VALUES (2, 'E')
INSERT INTO @b (id, txt) VALUES (2, 'F')

INSERT INTO @b (id, txt) VALUES (3, 'G')
INSERT INTO @b (id, txt) VALUES (3, 'H')
INSERT INTO @b (id, txt) VALUES (3, 'I')

-- Конкатенация строк 
-- для исходной таблицы
-- в одном запросе через запятую
SELECT 
    a.id,
    STUFF((
         SELECT DISTINCT
             ', ' + b.txt
         FROM @b b
         WHERE b.id = a.id
         FOR XML PATH('')
    ), 1, 2, '')
FROM @a a

Комментарии