【发布时间】: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