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