SQL Server で Stuff と 'For Xml Path' はどのように機能しますか? 質問する

SQL Server で Stuff と 'For Xml Path' はどのように機能しますか? 質問する

表は次のとおりです:

識別子 名前
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

おすすめ記事