COALESCE是实现这一目标的最佳方式吗?

时间:2010-01-12 23:33:18

标签: sql sql-server-2005

只是想看看是否有人有更好的方法来完成我需要的东西。

首先是背景。我的数据库中有一个表,目前有大约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。

干杯,

麦克

5 个答案:

答案 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)

另一种选择是使用CLR。您可以创建一个用c#或VB.Net编写的自定义用户定义聚合,它将返回逗号分隔列表(然后使用完全,就像使用 SUM 一样,或者的 COUNT )。

请参阅this pagethis page开始使用。