Рассмотрим на примере. Есть задача и список исполнителей, необходимо построчно вывести задачи и ответственных. В случае группировки по задаче, ответственному мы получим число записей = число задач * число ответственных, нам же требуется вывести задачи построчно. Это отлично реализуется с помощью инструкции MS SQL - FOR XML PATH, изначально используемой для формирования xml строки из выборки.
Пример кода: task - Задачи, executer - Исполнитель:
SELECT e.name, -- название задачи (SELECT t.name + ', ' -- список исполнителей для задачи через запятую FROM task t WHERE t.executor = e.id FOR XML PATH('')) FROM executer e
Рассмотрим более интересный пример, более близкий к изначальному применению FOR XML PATH - сформируем CSV файл из таблицы одним запросом без всяких циклов:
SELECT t.field1 + ';' + --объединяем список столбцов через разделитель t.field2 + ';' + t.field3 + ';' + t.field4 + '; ' --перенос строки FROM table t WHERE 1=1 FOR XML PATH('')Если field не строка, то его нужно привести: CAST(field AS VARCHAR(50)).
Добавление для ORACLE
SELECT t.executor, wmsys.wm_concat(t.name) FROM FROM task t GROUP BY t.executor