我正在寻找一个将通过表格的数据库脚本,并会给我一个逗号分隔的输出。
我需要在一次性脚本中完成所有操作。我正在考虑从只有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
答案 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