基于行ID SQL合并表中的第二列

时间:2012-04-20 19:23:49

标签: sql sql-server-2008

我正在寻找一个将通过表格的数据库脚本,并会给我一个逗号分隔的输出。

我需要在一次性脚本中完成所有操作。我正在考虑从只有ID的临时表开始,然后获取所有项目,但我不确定如何“预约”数据库。

What I have                    What I'm looking for

 ID | Items                       ID | Items
 1  |  A                          1  | A,B,C,D
 1  |  B                          2  | A,B,C
 1  |  C                          3  | B,C
 1  |  D
 2  |  A
 2  |  B
 2  |  C
 3  |  B 
 3  |  C

2 个答案:

答案 0 :(得分:0)

declare @t table(id int, items varchar(8));
insert into @t values(1,'A')
, (1,'B')
, (1,'C')
, (1,'D')
, (2,'A')
, (2,'B')
, (2,'C')
, (3,'B')
, (3,'C')

select distinct id
, (STUFF((SELECT ',' + items FROM @t t2 WHERE  t1.id = t2.id ORDER BY items
FOR XML PATH(''), TYPE, ROOT).value('root[1]','nvarchar(max)'),1,1,'')) as items
from @t t1

结果:

id          items
----------- ------------------------
1           A,B,C,D
2           A,B,C
3           B,C

答案 1 :(得分:0)

可能是我的想象力,但这似乎运行得更快,查询计划更容易阅读。但是,查询计划中的xmlreader似乎总是过度估计实际查询成本。

declare @table table (
id int
,val varchar(2)
)
insert @table
Values (1 ,'a'),
(1,'b'),
(1,'c'),
(1,'d'),
(2,'a'),
(2,'b'),
(2,'c'),
(3,'a'),
(3,'b')
select id, stuff((
select (','+val) from @table q1
    where q1.id = q2.id
    for xml path('')),1,1,'') val
    from @table q2
    group by q2.id

这几乎做了同样的事情,除了它通过制作一个没有元素规范的不正确的xml文档而排除了xml的数据读取器。至于内置功能的内容,请参阅http://msdn.microsoft.com/en-us/library/ms188043.aspx 他正在使用东西来操纵字符串。如果你添加逗号,你最终会得到一个字符串,该字符串在末尾有一个额外的逗号或者在开头有一个逗号。 此示例使用空白字符串''

替换从位置1开始的字符串中的前2个字符
select STUFF(',,test,test1,test2,test3',1,2,'') 

数据:

test,test1,test2,test3