仕組みは次のとおりです。
1。 FORXMLを使用してXML要素文字列を取得する
クエリの最後にFORXMLPATHを追加すると、PATH引数に要素名が含まれているXML要素としてクエリの結果を出力できます。たとえば、次のステートメントを実行する場合:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
空白の文字列(FOR XML PATH(''))を渡すと、代わりに次のようになります。
,aaa,bbb,ccc,ddd,eee
2。 STUFFで先頭のカンマを削除します
STUFFステートメントは、文字通り1つの文字列を別の文字列に「詰め込み」、最初の文字列内の文字を置き換えます。ただし、結果の値のリストの最初の文字を削除するためだけに使用しています。
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
STUFF
のパラメータ は:
- 「詰め込む」文字列(この場合、先頭にコンマを付けた名前の完全なリスト)
- 文字の削除と挿入を開始する場所(1、空白の文字列に詰め込みます)
- 削除する文字数(1は先頭のカンマ)
したがって、最終的には次のようになります。
aaa,bbb,ccc,ddd,eee
3。完全なリストを取得するには、IDに参加してください
次に、これを一時テーブルのIDのリストに結合して、次の名前のIDのリストを取得します。
SELECT ID, abc = STUFF(
(SELECT ',' + name
FROM temp1 t1
WHERE t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') from temp1 t2
group by id;
そして、結果が得られました:
これがお役に立てば幸いです!