sql >> データベース >  >> RDS >> Sqlserver

SQLServerでStuffと'ForXml Path'はどのように機能しますか?

    仕組みは次のとおりです。

    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;
    

    そして、結果が得られました:

    Id 名前 1aaa、bbb、ccc、ddd、eee

    これがお役に立てば幸いです!



    1. テキストまたは数値フィールド–データ型を切り替えるための単純なSQLメソッド

    2. MySQL5.7からMySQL8.0への移行-知っておくべきこと

    3. MariaDBの「エラー1054(42S22):「on句」の不明な列「…」」を修正

    4. ヒストグラムの粗い配置を使用したSQLServerの結合推定