admin

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

sql

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


阅读 177

收藏
2021-06-07

共1个答案

admin

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的一个众所周知的技巧-因为该列未命名,所以不生成任何元素,并且仅输出(每行的)原始文本,然后将其合并为单个行。

互联网上很少有文章试图对其进行详细解释,因为该代码本身仅是一个解释。

2021-06-07