2014-02-08 46 views
0

我有一个数据库表跟踪项目列表,它们在必要时被插入和移除。我发现了一堆行不通的行,我想在插入或删除一行时做一些处理。在数据库队列中重新排序无序的行

目前,我使用的是基本的INSERT语句

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 

这些查询做工精细delete一个用于从队列中的单个项目,但是当我删除不按顺序排列的项目,它抛出的一切不正常的。

我一直在试图找出有为了排队号码的最好办法,即... 1,2,3,4,5,6,等等......当项目被添加或删除。

我在想插入或删除操作后是删除或添加1个检查相邻号码是存在的,如果不再计数,跟踪和继续下去,直到我找到的数量。然后我可以减去这个数字并回到原点。

我为我使用Python和MSSQL服务器2008R2包括在标签列表蟒蛇。

这似乎有点凌乱我,所以我希望有人将有一个更优雅的方式。由于

回答

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) 

更新表

使用ROW_NUMBER()函数与CTE更新表。

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

OR

更新使用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 ║ 
╚═════════╩════════╝ 
+0

我不知道该功能的或with语句。让我试试看吧 – Drewdin

+1

WITH函数实际上是CTE'Comman Table Expression'的语法,而row_number()是sql server中的一个排名函数。非常有用的一些非常棘手的操作在SQL Server中。 –

+0

我对CTE并不熟悉,我需要研究它 – Drewdin