Вы отметили свой вопрос как SQL-Server 2017 и спрашиваете:
Разве эта версия не поддерживает хакер XML-to-CSV из предыдущих версий?
Да, это так (как сказал ответ Пауриана), но это даже лучше: Эта версия поддерживает STRING_AGG()
:
Не зная ваших таблиц, я настроил мини-макет для имитации вашей проблемы (в соответствии с вашим Таблицы нормализованы, и таблица соединений представляет собой простую карту «многие ко многим» ):
Две таблицы с таблицей отображения m:n
между
DECLARE @mockupA TABLE(ID INT,SomeValue VARCHAR(10));
INSERT INTO @mockupA VALUES(1,'A1'),(2,'A2');
DECLARE @mockupB TABLE(ID INT,SomeValue VARCHAR(10));
INSERT INTO @mockupB VALUES(1,'B1'),(2,'B2');
DECLARE @mockupMapping TABLE(ID_A INT,ID_B INT);
INSERT INTO @mockupMapping VALUES(1,1),(1,2),(2,2);
- запрос просто объединит эти таблицы, а затем будет использовать GROUP BY
вместе с STRING_AGG()
. Предложение WITHIN GROUP
позволяет определить порядок сортировки объединенной строки.
SELECT a.ID,a.SomeValue
,STRING_AGG(b.SomeValue,', ') WITHIN GROUP(ORDER BY b.ID) AS B_Values
FROM @mockupA a
INNER JOIN @mockupMapping m ON a.ID=m.ID_A
INNER JOIN @mockupB b ON b.ID=m.ID_B
GROUP BY a.ID,a.SomeValue;
Результат
ID SomeValue B_Values
1 A1 B1, B2
2 A2 B2