只是想看看是否有人有更好的方法来完成我需要的东西。
首先是背景。我的数据库中有一个表,目前有大约20,000行。在表中,我们有一个FirstName和LastName列。还有一个作为ReferenceID的列。每个ReferenceID可以有多个FirstName,LastName组合。
这意味着当我们从表中执行select *时,我们会为每个ReferenceID获取多行(因为每个用户都有一行)。
我想在名为Name的列中连接这两列,同时为ReferenceID取每一行并将其转换为一行。 (基本上压平数据)。
让我试着在这里画一个ascii图。
TABLE
ID ReferenceID FirstName LastName
________________________________________________
1 1 Mike Ekim
2 1 Tom Mot
3 1 Pete Etep
4 2 Ryan Nayr
5 3 Jerry Yrrej
所以我想要的最终结果是像
这样的集合RESULT SET
ReferenceID Name
__________________________________
1 Mike Ekim, Tom Mot, Pete Etep
2 Ryan Nayr
3 Jerry Yrrej
我真正需要知道的是,在我开始使用COALESCE的路径之前尝试旋转我的结果是否有更好的方法来实现这一目标?使用SQL Server 2005。
干杯,
麦克
答案 0 :(得分:3)
以下是使用xml路径技术的方法(在那里也有合并......)
SELECT DISTINCT n.ReferenceID,
STUFF((SELECT ', ' + COALESCE(n2.FirstName+' '+n2.LastName,n2.FirstName,n2.LastName,'NoName')
FROM namelist n2
WHERE n.referenceid = n2.referenceid
ORDER BY n2.lastname, n2.firstname
FOR XML PATH('')
), 1, 2, '') AS [Name]
FROM namelist n
答案 1 :(得分:2)
您可以使用FOR XML PATH
生成以逗号分隔的列表。例如,请参阅此blog post:
SELECT P.Name + ','
FROM Production.Product AS P
ORDER BY P.Name
FOR XML PATH('')
答案 2 :(得分:2)
本文介绍了此主题:Concatenating Row Values in Transact-SQL。有几种技术(XML PATH,递归CTE,CLR,递归UDF,基于游标,变量连接),每个都简要介绍,文章中的注释和链接源进一步涵盖了该主题。
我最喜欢的技术是XML PATH(Andomar已发布)。
答案 3 :(得分:1)
对我来说很好看。在过去,我做过类似的事情,并发现COALESCE
技巧是最简单的方法。
这是一个很难找到的常用功能,除非你知道你在寻找什么,所以这里有一篇很好的文章,详细描述了如何做到这一点:http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string。
答案 4 :(得分:1)