2

parent/child関係の次のサンプルテーブル構造があります。

parentテーブル

id    LongText
--------------
10    
20    

childテーブル

id    char     value
--------------------
10    COLOR    RED
10    HEIGHT   1FT
20    COLOR    BLUE
20    WIDTH    2FT

子テーブルの行の特定のフィールドを連結して親テーブルに配置する必要があることを指定する要件があります。可能であれば、これを1つのSQLクエリで完了したいと思います。私が書いた更新ステートメントは次のとおりです。

UPDATE
  parent
SET
  LongText = COALESCE(LongText, N'')
              + child.char + N': ' + child.val + ','
FROM
  parent INNER JOIN child
    ON
      parent.id = child.id

しかし、私は次の結果しか得られません。

id    LongText
------------------
10    COLOR: RED,
20    COLOR: BLUE,

私はこれを手に入れることを期待します(または私が欲しいと言うべきです

id    LongText
------------------
10    COLOR: RED,HEIGHT: 1FT
20    COLOR: BLUE,WIDTH: 2FT

これは可能ですか?これをどのように行うことができるかについての提案はありますか?どんな助けでも大歓迎です!

参考までにSQLfiddleを示します。

4

1 に答える 1

4
update parent
set longtext =
    stuff((
    select ',' + c.char + ': ' + c.val
    from child c
    where c.uid = parent.uid
    for xml path(''), type).value('.','nvarchar(max)'),1,1,'');

SQLFiddleをソリューションで更新しました。

  1. STUFF()','関数は、最初の特性から先頭(コンマ)を削除します。

  2. クエリ結果からXMLドキュメントを作成するためのFORXML これはSQLServerでよく知られているトリックです。列に名前が付けられていないため、要素は生成されず、(各行の)生のテキストのみが出力され、1つの行にまとめられます。

コード自体が説明としてほとんど残されているため、インターネット上で詳細に説明しようとしている記事はほとんどありません。

于 2012-11-12T21:20:51.997 に答える