重新排序数据库队列中出现故障的行

时间:2014-02-08 01:56:09

标签: python sql sql-server

我有一个跟踪项目列表的数据库表,必要时会插入和删除它们。我发现了一堆排列很少的行,我希望在插入或删除行时能够处理它。

目前,我正在使用基本的插入语句

insert into this_queue (thing, queNum) VALUES ('thing1', 1)

delete from this_queue where thing = 'thing1'

update this_queue set queNum = queNum - 1 where queNum > 1

这些查询可以很好地从队列中删除单个项目,但是当我删除不按顺序排列的项目时,它会使所有内容无法解决。

我一直在试图找出按顺序排列队列号的最佳方法,即...... 1,2,3,4,5,6等......当一个项目被添加或删除时。< / p>

我在考虑插入或删除后删除或添加1检查相邻号码是否存在,如果不再计数,请跟踪并继续,直到找到号码。然后我可以减去数字并回到原点。

我在标签列表中包含了python,因为我正在使用python和mssql server 2008r2。

这对我来说似乎有些混乱所以我希望有人会有更优雅的方式。感谢

1 个答案:

答案 0 :(得分:0)

测试数据

CREATE TABLE Test_Order(Thing varchar(50), queNum INT) 
GO

INSERT INTO Test_Order (Thing, queNum) VALUES
('thing 1', 1),('thing 2', 2),('thing 3', 3),
('thing 4', 4),('thing 5', 5),('thing 6', 6),
('thing 7', 7),('thing 8', 8),('thing 9', 9)
GO

表格

╔═════════╦════════╗
║  Thing  ║ queNum ║
╠═════════╬════════╣
║ thing 1 ║      1 ║
║ thing 2 ║      2 ║
║ thing 3 ║      3 ║
║ thing 4 ║      4 ║
║ thing 5 ║      5 ║
║ thing 6 ║      6 ║
║ thing 7 ║      7 ║
║ thing 8 ║      8 ║
║ thing 9 ║      9 ║
╚═════════╩════════╝

删除一些随机记录

DELETE FROM Test_Order WHERE queNum IN (2, 4, 6)

更新表格

使用带有CTE的ROW_NUMBER()函数更新表。

;With CTE
AS
 (
  SELECT  Thing
         ,queNum
         ,rn = ROW_NUMBER() OVER (ORDER BY queNum)
  FROM Test_Order
 )
UPDATE CTE
SET queNum = rn

使用INNER JOIN和ROW_NUMBER()函数

更新表
UPDATE T1
SET T1.queNum = T2.rn
FROM Test_Order T1 INNER JOIN 
(
  SELECT  Thing
         ,queNum
         ,rn = ROW_NUMBER() OVER (ORDER BY queNum)
  FROM Test_Order
)T2
ON T1.Thing = T2.Thing 
AND T1.queNum = T2.queNum

最终结果

SELECT * FROM Test_Order

╔═════════╦════════╗
║  Thing  ║ queNum ║
╠═════════╬════════╣
║ thing 1 ║      1 ║
║ thing 3 ║      2 ║
║ thing 5 ║      3 ║
║ thing 7 ║      4 ║
║ thing 8 ║      5 ║
║ thing 9 ║      6 ║
╚═════════╩════════╝