表は次のとおりです:
識別子 | 名前 |
---|---|
1 | ああ |
1 | bbb |
1 | ccc |
1 | ddd |
1 | ええ |
必要な出力:
識別子 | アブ |
---|---|
1 | aaa、bbb、ccc、ddd、eee |
クエリ:
SELECT ID,
abc = STUFF(
(SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, ''
)
FROM temp1 GROUP BY id
このクエリは正常に動作しています。ただし、どのように動作するのか、またはこれを行う他の簡単な方法があるかどうかの説明が必要です。
私はこれを理解するのに非常に混乱しています。
ベストアンサー1
仕組みは次のとおりです:
1. FOR XMLでXML要素文字列を取得する
クエリの最後に FOR XML PATH を追加すると、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;
そして、結果は次のようになりました:
識別子 | 名前 |
---|---|
1 | aaa、bbb、ccc、ddd、eee |