【问题标题】:SQL updating with string concat使用字符串 concat 更新 SQL
【发布时间】:2015-06-29 01:21:33
【问题描述】:

我正在尝试更新一对多行,但最终结果是一对一更新。基本上,我有一个字符串列,我想将连接返回的所有结果连接起来(更新的顺序无关紧要)。

-- destination table
CREATE TABLE #TmpRes (SiteID bigint,ResString nvarchar(28) );
insert into #TmpRes (SiteID,ResString) values (1,'..'), (2,'..'), (3,'..');

-- join table (I only want to update SiteID #2)
CREATE TABLE #TmpData (DataNum bigint,DataStr nvarchar(28) );
insert into #TmpData (DataNum,DataStr) values (2,'CC'), (2,'BB'), (2,'AA');

-- this shows that the join is correct
select 'TJoin' TableName, *
FROM #TmpRes tr 
    join #TmpData td ON (tr.SiteID=td.DataNum) -- [1]

-- This update is only updating 1 row when it should be 3 rows
update #TmpRes 
    set ResString=tr.ResString + td.DataStr + tr.ResString
FROM #TmpRes tr 
    join #TmpData td ON (tr.SiteID=td.DataNum)

select '#TmpData' TableName, * from #TmpData --[2]

-- **expecting to see record 2 ResString to look like**
-- **..CC....BB....AA..**
select '#TmpRes' TableName, * from #TmpRes --[3]

以上SELECTs的结果:

1:

TJoin,2,..,2,CC

TJoin,2,..,2,BB

TJoin,2,..,2,AA

2:

TmpData,2,CC

TmpData,2,BB

TmpData,2,AA

3:

TmpRes,1,..

TmpRes,2,..CC..

TmpRes,3,..

我使用的是 SQLServer 2014,但我确信任何 SQL Server 的结果都是相同的。

【问题讨论】:

  • join如何更新三行?您在 siteid = datanum 上进行匹配,并且一张表的 datanum 为 2。您希望 siteid 1 / 3 在更新后究竟是什么样子?
  • 最后一次选择的结果是什么?请以表格格式使用所需结果和当前实际结果编辑您的问题。
  • 我建议您不要这样做。它是非关系的,这里没有明显的理由说明你为什么需要它。数据已经正确地构造为跨两个表的一对多,只需使用它即可。如果您确实需要为某些客户端应用程序将许多值格式化为一列,那么只有在您将数据返回到该客户端时才这样做。不要通过传播到您的数据库架构中来加剧这个巨大的错误。
  • 选择的结果是
  • 请编辑问题。在评论中以可读的格式发布查询结果太难了。

标签: sql sql-server join string-concatenation


【解决方案1】:

-- 期望看到记录 2 ResString 的样子:

-- ..CC..BB....AA..

我认为您想在连接其他表的行的特定值的基础上更新表,您可以在subquery 中使用FOR XML PATH

update tmr 
    set tmr.ResString=(
                select tr.ResString + td.DataStr
                FROM #TmpRes tr 
                join #TmpData td ON (tr.SiteID=td.DataNum)
                where tr.SiteID=tmr.SiteID
                For XML PATH ('')
                )
FROM #TmpRes tmr 
    join #TmpData td ON (tmr.SiteID=td.DataNum)

检查结果:

select '#TmpRes' TableName, * from #TmpRes

TableName   SiteID  ResString
#TmpRes       1     ..
#TmpRes       2     ..CC..BB..AA
#TmpRes       3     ..

【讨论】:

  • 谢谢法赫格。我没有使用过“For XML Path”,也不确定它是如何工作的,但我需要研究才能理解。
  • 不客气,好吧,试试吧,它对连接行非常有用
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2016-04-06
  • 2021-11-11
相关资源
最近更新 更多