sql查询-使用同一表中的记录值更新现有中的字段

sql查询-使用同一表中的记录值更新现有中的字段,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,环境:SQL Server 2012 我有一个事务表,其中包含一组具有组id列的记录 在下面的示例中,组2记录是从组1记录复制的,除了sideId、sideSort、topId和topSort列。是否有一种方法可以将其从组1级联到组2,仅用于上排序和侧排序?困难的是topId和sideId不一样,因为父表中有标识字段 这是一个 你可以这样做。这是基于您将一个组(@copiedFromGroupId)的所有记录复制到另一个组(@copiedToGroupId)的假设,即ID将按第一个组中的记录数移

环境:SQL Server 2012

我有一个事务表,其中包含一组具有组id列的记录

在下面的示例中,组2记录是从组1记录复制的,除了sideId、sideSort、topId和topSort列。是否有一种方法可以将其从组1级联到组2
,仅用于上排序和侧排序
?困难的是topId和sideId不一样,因为父表中有标识字段

这是一个


你可以这样做。这是基于您将一个组(
@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

假设
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

这是基于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;

group1的topId值和group2的topId值之间是否存在特定关系?不幸的是,没有。我的意思是,从视觉上你可以看到顶部Id 3来自顶部Id 1,4来自顶部Id 2,也许?这不是一个很好的指示。。。为什么这些栏目没有从原始记录中复制?