我有一个跟踪项目列表的数据库表,必要时会插入和删除它们。我发现了一堆排列很少的行,我希望在插入或删除行时能够处理它。
目前,我正在使用基本的插入语句
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。
这对我来说似乎有些混乱所以我希望有人会有更优雅的方式。感谢
答案 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 ║
╚═════════╩════════╝