2015-06-10 2 views
3

Я ищу, чтобы создать запрос SQL Server, который объединит ресурсы с одной и той же Задачей в одну строку строки/записи, используя три таблицы. Мой запрос SQL Server ниже, похоже, работает некорректно и занимает очень много времени, а затем ошибки. Благодаря!SQL - объединение нескольких строк данных в одну строку и столбец

Таблица Задача

TaskUID 
TaskName 

Назначение Таблица

TaskUID 
ResourceUID 

Таблица ресурсов

ResourceUID 
ResourceName 

Перед

**Task Name  Resource Name** 
Weapon Launch Amy 
Weapon Launch Sam 
Weapon Launch Marisa 
Weapon Launch Katy 
Weapon Launch John 
Sweating Tears Marisa 
Sweating Tears Joe 
Sweating Tears Katy 
Sweating Tears Michael 
Ramp Diver  Joe 
Ramp Diver  Michael 

После

**Task Name  Resource Name** 
Weapon Launch Amy; Sam; Marisa; Katy; John 
Sweating Tears Marisa; Joe; Katy; Michael 
Ramp Diver  Michael; Joe 

Запрос

SELECT T.TaskName, 
STUFF((SELECT ', ' + R.RESOURCENAME 
FROM 
[Resource Table] R 
LEFT JOIN [Assignment Table] A ON R.ResourceUID=A.ResourceUID 
WHERE 
A.TASKUID=T.TaskUID 
Group by R.RESOURCENAME 
FOR XML PATH('')), 1, 1,'') Resources 
FROM [Task Table] T 
INNER JOIN [Assignment Table] A ON T.TASKUID=A.TASKUID 
+0

Верните три набора результатов и скрежете их вместе. Это самый простой способ. – Will

+0

См. [This SO post] (http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-server) для того, как это сделать. –

+0

Вы можете создать агрегатную функцию, используя сборку. – Nizam

ответ

0

Пожалуйста, попробуйте:

SELECT T.TaskName, Resources 
FROM TaskTable T 
CROSS APPLY (
    SELECT 
    STUFF((SELECT ', ' + R.RESOURCENAME 
     FROM [ResourceTable] R 
     INNER JOIN [AssignmentTable] A ON R.ResourceUID=A.ResourceUID 
     WHERE A.TASKUID = T.TASKUID 
     Group by R.RESOURCENAME 
     FOR XML PATH('')), 1, 1,'') Resources 
) N(Resources) 

SQL Fiddle

+0

Низам, я пробовал, и он работал более 15 минут. Мой [TaskTable] имеет около 40 000 записей. Я думаю, что это закончится, но потребуется немного времени, чтобы бежать. Спасибо за помощь! –

+0

Как насчет вашей таблицы ресурсов? – Nizam

+0

Около 900 записей в [ResourceTable]. –

0

Благодаря Низам я понял, что должен использовать таблицы в базе данных вместо представлений, так как у меня нет прав на создание индексов. Встроенные индексы допускают более быстрые запросы.

SELECT DISTINCT 
T.TASK_NAME, 
    STUFF((SELECT ', '+ R.RES_NAME 
      FROM PUB.MSP_RESOURCES R 
      JOIN PUB.MSP_ASSIGNMENTS A ON A.RES_UID=R.RES_UID 
      WHERE A.TASK_UID=T.TASK_UID 
      AND R.RES_TYPE IN(2) 
      GROUP BY R.RES_NAME 
      FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') AS RESOURCES