2013-11-25 62 views
2

环境记录值的现有更新字段:SQL Server 2012的SQL查询 - 在同一个表

我有一个包含一组与组ID栏记录的事务表。

在下图所示的示例中,组2记录是从组1记录复制的,除了sideId,sideSort,topId和topSort列之外。有没有办法将组1降级到组2 for just topSort and sideSort?困难的部分是,由于父表中的标识字段,topId和sideId不相同。

这里是一个sqlfiddle of the example

enter image description here

+0

是否有1组的topId值和第2组的TopID值之间的特殊关系? – cha

+0

不幸的不是。我的意思是,从视觉上你可以看到最高Id 3来自顶部Id 1和4来自2,也许? – Rod

+0

这不是一个很好的指示......为什么这些列不是从原始记录中复制的? – Szymon

回答

0

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

SQLFiddle demo

1

你可以这样来做。这是基于假设您将一个组的所有记录(@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

1

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

SQLFiddle