0

テーブルを調べて、コンマで区切られた1つの出力を提供するデータベーススクリプトを作成しようとしています。

これをすべて1回限りのスクリプトで行う必要があります。IDだけの一時テーブルから始めて、すべてのアイテムを取得することを考えていましたが、データベースを「foreach」する方法がよくわかりません。

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
4

2 に答える 2

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
于 2012-04-20T19:28:07.343 に答える
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つのカンマが含まれる文字列になります。この例では、位置1から始まる文字列の最初の2文字を空白の文字列に置き換えます''

select STUFF(',,test,test1,test2,test3',1,2,'') 

データ:

test,test1,test2,test3
于 2012-04-20T20:28:52.370 に答える