2

我有以下用于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供参考。

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. FOR XML从查询结果创建 XML 文档。这是 SQL Server 的一个众所周知的技巧 - 因为没有命名列,所以没有生成任何元素,并且只输出(每一行的)原始文本,将它们混合成一行。

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

于 2012-11-12T21:20:51.997 回答