Sql Update语句以对表队列重新排序

Sql Update语句以对表队列重新排序,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,有一个包含以下测试数据的表格 PKId EqId Worker Queue 1 1 Worker1 1 3 1 Worker3 3 2 1 Worker2 4 4 1 Worker4 7 需要更新将轮换工人的表格,以便在update语句之后,数据如下所示 PKId EqId

有一个包含以下测试数据的表格

PKId         EqId    Worker     Queue
1             1      Worker1      1
3             1      Worker3      3
2             1      Worker2      4
4             1      Worker4      7 
需要更新将轮换工人的表格,以便在update语句之后,数据如下所示

PKId         EqId   Worker  Queue
1             1     Worker1   7
3             1     Worker3   1
2             1     Worker2   3
4             1     Worker4   4 

您几乎可以通过连接来实现这一点:

select pkid, eqid, worker, queue, tprev.queue as newqueue
from t left outer join
     t tprev
     on t.pkid = tprev.pkid + 1
但是,PkID=1的结果是NULL。因此,我们需要添加以下内容:

select pkid, eqid, worker, queue, coalesce(tprev.queue, lastone.queue) as newqueue
from t left outer join
     t tprev
     on t.pkid = tprev.pkid + 1 cross join
     (select top 1 queue from t order by pkid desc) as lastone
如果您确实想要更新,那么我们可以将其放在update语句中:

update t
    set queue = newqueue
    from (select pkid, eqid, worker, queue,
                 coalesce(tprev.queue, lastone.queue) as newqueue
          from t left outer join
               t tprev
               on t.pkid = tprev.pkid + 1 cross join
               (select top 1 queue from t order by pkid desc) as lastone
         ) newt
    where t.pkid = newt.pkid
update t
    set queue = newqueue
    from (select pkid, eqid, worker, queue,
                 coalesce(Newqueue, lastone.queue) as newqueue
          from (select t.*,
                       (select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
                       ) as newQueue
                from t
               ) t cross join
               (select top 1 queue from t order by pkid desc) as lastone
        ) newt
    where t.pkid = newt.pkid
我知道你的主键可能有洞。在这种情况下,从以下查询开始:

select t.*, newQueue
from (select t.*,
             (select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
             ) as newQueue
      from t
     ) t
在update语句中:

update t
    set queue = newqueue
    from (select pkid, eqid, worker, queue,
                 coalesce(tprev.queue, lastone.queue) as newqueue
          from t left outer join
               t tprev
               on t.pkid = tprev.pkid + 1 cross join
               (select top 1 queue from t order by pkid desc) as lastone
         ) newt
    where t.pkid = newt.pkid
update t
    set queue = newqueue
    from (select pkid, eqid, worker, queue,
                 coalesce(Newqueue, lastone.queue) as newqueue
          from (select t.*,
                       (select top 1 queue from t t2 where t2.pkid < t.pkid order by t2.pkid desc
                       ) as newQueue
                from t
               ) t cross join
               (select top 1 queue from t order by pkid desc) as lastone
        ) newt
    where t.pkid = newt.pkid
尝试:


谢谢-我想差不多了-唯一的问题是PKid不是顺序的。另外,我不确定如何使用update语句中的最后一个查询。这可能是因为我完全弄乱了语法。我有两个相互矛盾的想法;我想我已经修复了它。Tx-我将表命名为“temp”,并使用上面的查询,我尝试了这一点,但没有起作用。更新temp set queue=newqueue from select PrimaryId,EquipId,worker,t.queue,coalesceNewqueue,lastone.queue as newqueue from select temp.*,从temp t2中选择top 1队列,其中t2.primaryid