2012-11-12 85 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