如何基于已更新行的序列值更新其他行的Rank字段?
解决方案
直接针对指定ID更新
如果只需要更新你列出的特定ID(23、24、26、27、28),可以直接执行以下UPDATE语句,将这些行的Rank值减1:
UPDATE FAQ SET Rank = Rank - 1 WHERE ID IN (23, 24, 26, 27, 28);
执行后,这些行的Rank会从原有的4、5、6、7、8分别变为3、4、5、6、7,正好符合你的需求。
通用的Rank调整方法(适用于任意行移动场景)
如果以后需要频繁调整Rank位置,不想每次手动指定ID,可以用CTE实现自动调整:
WITH RankAdjustment AS ( SELECT ID, Rank, -- 针对被移动行(ID=30)的原Rank(3)到新Rank(8)之间的行,将Rank减1 CASE WHEN Rank > 3 AND Rank < 8 THEN Rank - 1 ELSE Rank END AS NewRank FROM FAQ ) UPDATE FAQ SET Rank = ra.NewRank FROM FAQ f INNER JOIN RankAdjustment ra ON f.ID = ra.ID WHERE ra.NewRank != f.Rank;
这个方法会自动识别所有Rank在3(ID30的原Rank)到8(ID30的新Rank)之间的行,将它们的Rank减1,无需手动列出ID,更灵活。
为什么你之前的代码无效
你使用的变量更新语句:
DECLARE @SrNo SMALLINT = 0; UPDATE FAQ SET @SrNo = Rank = @SrNo + 1;
这个语句会给整个表的所有行重新分配从1开始的连续Rank值(执行顺序依赖于表的存储顺序,通常会回到初始排序),而不是只调整你需要的部分行,所以会恢复到最初的Rank状态。
内容的提问来源于stack exchange,提问作者Ariff Zaki Shaikh Nasir
相关产品推荐
相关产品推荐

