基于多子表行的SQL更新父表字段

时间:2012-11-12 21:15:34

标签: sql sql-server tsql sql-server-2005

我有parent / child关系的以下示例表结构。

parent

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

child

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

我有一个要求,它指定子表行中的某些字段需要连接在一起并放在父表中。我想在单个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供参考。

1 个答案:

答案 0 :(得分: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. FOR XML从查询结果中创建XML文档。这是SQL Server众所周知的技巧 - 因为列没有命名,没有生成元素,只输出原始文本(每行),将它们拼凑成一行。

  3. 互联网上很少有文章试图详细解释它,因为代码本身就是一个解释。