环境记录值的现有更新字段:SQL Server 2012的SQL查询 - 在同一个表
我有一个包含一组与组ID栏记录的事务表。
在下图所示的示例中,组2记录是从组1记录复制的,除了sideId,sideSort,topId和topSort列之外。有没有办法将组1降级到组2 for just topSort and sideSort
?困难的部分是,由于父表中的标识字段,topId和sideId不相同。
环境记录值的现有更新字段:SQL Server 2012的SQL查询 - 在同一个表
我有一个包含一组与组ID栏记录的事务表。
在下图所示的示例中,组2记录是从组1记录复制的,除了sideId,sideSort,topId和topSort列之外。有没有办法将组1降级到组2 for just topSort and sideSort
?困难的部分是,由于父表中的标识字段,topId和sideId不相同。
假设Id
乃于本集团的订单场:
WITH C as
(
select Tracker.*,
ROW_NUMBER() OVER (PARTITION BY GroupId ORDER BY Id) as RN
FROM Tracker
)
UPDATE CT
SET CT.topSort=CTU.topSort,
CT.sideSort=CTU.sideSort
FROM C as CT
JOIN C as CTU ON (CT.rn=CTU.rn)
and (CTU.GroupID=1)
WHERE CT.GroupID=2
你可以这样来做。这是基于假设您将一个组的所有记录(@copiedFromGroupId
)复制到另一个组(@copiedToGroupId
),即ID将按第一组中的记录数进行移位。
declare @copiedFromGroupId int = 1
declare @copiedToGroupId int = 2
declare @shift int
select @shift = (select max(id) from Tracker where GroupId = @copiedToGroupId)
- (select max(id) from Tracker where GroupId = @copiedFromGroupId)
UPDATE T1
SET
T1.TopSort = T2.TopSort,
T1.SideSort = T2.SideSort
FROM Tracker T1
INNER JOIN Tracker T2 ON T1.ID = T2.ID + @shift
入住这SQL Fiddle
这是基于ROW_NUMBER在TopId的顺序和SortID列:
update test
set test.topSort = mix.topSort, test.sideSort = mix.sideSort
from
(select a.groupid aGroupid, b.groupID, b.Id bID, a.topSort, a.sideSort
from (select groupid,
row_number() over(order by topID, sideId) rn,
topSort, sideSort,
id
from test where groupid=1) a
inner join
(select groupid,
row_number() over(order by topID, sideId) rn,
topSort, sideSort,
id
from test where groupid=2) b ON a.rn = b.rn) mix
inner join test on test.id=mix.bId
WHERE test.groupid=2;
是否有1组的topId值和第2组的TopID值之间的特殊关系? – cha
不幸的不是。我的意思是,从视觉上你可以看到最高Id 3来自顶部Id 1和4来自2,也许? – Rod
这不是一个很好的指示......为什么这些列不是从原始记录中复制的? – Szymon