SQL-将多行数据合并为一行和一列

3
我想创建一个SQL Server查询,使用三个表将具有相同任务的资源组合成一行/记录字符串。我的下面的SQL Server查询似乎无法正常工作,并且需要很长时间才能执行,然后出现错误。谢谢! 任务表
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

将三个结果集带回来,然后自己将它们压缩在一起。这是最简单的方法。 - user1228
请参考此篇 Stack Overflow 帖子,了解如何实现此操作。 - Tim Biegeleisen
您可以使用汇编语言创建聚合函数。 - Nizam
你的表中有索引吗?这会产生很大的差异。我相信Resource和Task表的ID是索引。那么[Assignment Table]呢?(http://sqlfiddle.com/#!3/4efb8/1) - Nizam
不,我们的表中没有索引。 - Paul Lor
2个回答

0
感谢 Nizam,我意识到应该使用数据库中的表而不是视图,因为我没有创建索引的权限。内置索引可以加快查询速度。
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

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

{{链接1:SQL Fiddle}}


Nizam,我已经尝试过了,执行需要超过15分钟的时间。我的[TaskTable]大约有40,000条记录。我认为它最终会完成,但运行需要相当长的时间。感谢您的帮助! - Paul Lor
你的资源表怎么样了? - Nizam
[ResourceTable] 中大约有 900 条记录。 - Paul Lor
我以前从未做过汇编语言,对SQL Server也很陌生。而且我也不确定在我的环境中是否需要特殊权限来进行汇编操作。 - Paul Lor
看看我的上面的评论。创建聚合函数非常容易。我已经打包了一个DLL来完成这个任务。我认为值得一试。 - Nizam
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接