2012-11-12 51 views
2

我有以下parent/child关系的示例表结构。基于多个子表行的SQL更新父表字段

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, 

我希望(或者我应该说我WANT)得到这个。

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

这可能吗?有关我如何做到这一点的任何建议?任何帮助表示赞赏!

以下是供参考的SQLfiddle

回答

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的一个众所周知的技巧 - 因为列没有被命名,没有生成元素,只有每行的原始文本被输出,一起被组合成一行。

在互联网上很少有文章试图详细解释它,因为代码几乎是作为解释本身。

+0

太棒了!现在我必须弄清楚它是如何工作的,以便我可以在别处使用它。任何机会,你可以打破这个声明在这里发生的事情或提供一些链接来阅读? – JoeFletch

+0

再次感谢!这有帮助! – JoeFletch