parent
/child
関係の次のサンプル テーブル構造があります。
parent
テーブル
id ShortText
--------------
10
20
child
テーブル
id char value order
-----------------------------
10 COLOR RED 1
10 HEIGHT 1FT 2
10 LENGTH 10FT 5
20 COLOR BLUE 1
20 WEIGHT 100LBS 3
20 WIDTH 2FT 4
子テーブルの行の特定のフィールドを連結して親テーブルのフィールドに配置する必要があることを指定する要件がありますShortText
。フィールドはShortText
最大 10 文字です。
私はこれを手に入れることを期待しています(または I WANTと言うべきです)。
id ShortText
---------------
10 RED,1FT,
20 BLUE,2FT,
可能であれば、単一の SQL クエリでこれを完了したいと考えています。これを行う方法と、各子レコード セットの反復処理を回避する方法について何か提案はありますか? どんな助けでも大歓迎です!
これが私がこれまでに試したことです。
次の更新ステートメント...
UPDATE
parent
SET
ShortText = COALESCE(ShortText, N'') +
CASE WHEN DATALENGTH(COALESCE(ShortText, N'') + child.val + ',')/2 < 10
THEN COALESCE(ShortText, N'') + child.val + ',' ELSE N'' END
FROM
parent INNER JOIN child
ON
parent.id = child.id
しかし、私は次の結果しか得られません。
id ShortText
------------------
10 RED,
20 BLUE,
私も次のことを試しましたが、長さをチェックしている case ステートメントが子テーブルの各行では実行されず、前の ShortText でのみ実行されるため、失敗しました。
UPDATE
p
SET
p.ShortText = p.ShortText +
STUFF((
SELECT
CASE WHEN
DATALENGTH(p.ShortText)/2 + DATALENGTH(c.val + N',')/2 < 10
THEN
c.val + N','
ELSE
N''
END
FROM
child as c
WHERE
c.id = p.id
FOR XML PATH(''), type).value('.','NVARCHAR(max)'), 1, 0, N'')
FROM
parent as p
参照用のSQLfiddleを次に示します。こちらにも同様の質問を投稿して回答を得ましたが、これは別の要件であり、長さの要件に合わせてスケーリングすることはできません。いつものように、どんな助けも大歓迎です。