Это тот же ответ, который я дал здесь: https://dba.stackexchange.com/questions/125771/multiple-column-concatenation/
ОП этого вопроса ссылается на ответ, данный здесь.Ниже вы можете увидеть, что иногда самый простой ответ может быть лучшим.Если SomeTable - это несколько таблиц, я бы пошел дальше и поместил его в CTE, чтобы избежать многократного повторения одного и того же сложного кода.
Я провел несколько тестов, используя чуть более 6 миллионов строк.С индексом для столбца идентификатора.
Вот что я придумал.
Ваш первоначальный запрос:
SELECT * FROM (
SELECT t.id,
stuff([M].query('/name').value('/', 'varchar(max)'),1,1,'') AS [SomeField_Combined1],
stuff([M].query('/car').value('/', 'varchar(max)'),1,1,'') AS [SomeField_Combined2]
FROM dbo.test t
OUTER APPLY(SELECT (
SELECT id, ','+name AS name
,','+car AS car
FROM test WHERE test.id=t.id
FOR XML PATH('') ,type)
AS M)
M ) S
GROUP BY id, SomeField_Combined1, SomeField_Combined2
Этот запрос выполнялся в течение ~ 23 минут.
Я запустил эту версию, которую я впервые узнал.В некотором смысле кажется, что это займет больше времени, но это не так.
SELECT test.id,
STUFF((SELECT ', ' + name
FROM test ThisTable
WHERE test.id = ThisTable.id
FOR XML PATH ('')),1,2,'') AS ConcatenatedSomeField,
STUFF((SELECT ', ' + car
FROM test ThisTable
WHERE test.id = ThisTable.id
FOR XML PATH ('')),1,2,'') AS ConcatenatedSomeField2
FROM test
GROUP BY id
Эта версия была запущена всего за 2 минуты.