Периодически возникает задача отображения форматированного списка строк из зависимой таблицы в результирующем множестве из исходной таблицы. Конечно можно завести переменную и простым запросом произвести конкатенацию, но часто бывает, что нужно произвести конкатенацию внутри большого запроса без процедурного процедурного программирования. И тогда на помощь приходит встроенная в 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
Комментарии
Отправить комментарий