2014-02-08 70 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