[英]T-SQL Fixing Row Order / Sequence
概述:
我的應用程序中有一個頁面,允許用戶設置記錄列表的優先級。 這些記錄基本上是團隊需要完成的任務或目標。 它們的給定順序取決於用戶將它們拖放到位。 用戶完成並保存更改后,它會循環訪問數據並使用各自的順序更新數據庫中的記錄。
問題:
我現在遇到的問題是在一個單獨的頁面上,用戶可以在該頁面上刪除可能具有優先級的記錄。 由於優先級的保存和計算是在另一頁上完成的,因此刪除記錄會導致序列中出現空白。
例:
優先項目:
A (1)
B (2)
C (3)
D (4)
E (5)
F (6)
G (7)
項目從其他頁面/功能中刪除:
A (1)
B (2)
C (3)
D (4)
F (6)
G (7)
題:
我需要創建一些類型的函數,我可以在刪除記錄后運行“修復/重新同步”這個數字序列。 基本上,需要更新單列priority
,在示例中, F
需要更新為5, G
更新為6以便修復序列間隙。
我嘗試過的:
大多數人正在研究解決這個問題的方法。 我正在考慮將所有記錄放入具有Auto Increment
編號的臨時表中,並使用它來更新優先級,但我覺得可能有一個更簡單的解決方案並想要一些意見。
刪除后,您只需更新大於剛剛刪除的優先級的行。 因此,如果您的列名稱為Priority,並且您刪除Priority = 5的行,則只需執行此類操作即可。 請注意,您不需要在此處使用循環。
Update YourTable
set Priority = Priority - 1
where Priority > 5
正如其他人所建議的那樣,如果您一次只刪除一個,只需在刪除后立即更新數字。 如果要立即對整個表重新編號(可能有多個刪除),可以使用ROW_NUMBER()
和CTE:
DECLARE @Project TABLE (
Name nvarchar(100)
, Priority int
);
-- Projects that are prioritized
INSERT @Project ( Name, Priority ) VALUES
('A', 1)
, ('B', 2)
, ('C', 3)
, ('D', 4)
, ('E', 5)
, ('F', 6)
, ('G', 7)
;
SELECT * FROM @Project;
-- Projects get deleted
DELETE @Project WHERE Name = 'E';
DELETE @Project WHERE Name = 'C';
SELECT * FROM @Project;
-- Renumber
WITH P AS
(
SELECT Name, Priority, ROW_NUMBER() OVER ( ORDER BY Priority ) AS NewPriority
FROM @Project
)
UPDATE P SET Priority = NewPriority
;
-- Ta da!
SELECT * FROM @Project;
為什么不在從數據庫中提取記錄的過程中設置優先級? 這樣你不需要改變優先級,因為它總是在你讀取行時動態計算。 唯一的問題是,當用戶更改優先級序列后保存新序列時,將刪除所有記錄並以正確的順序將其重新添加,並使用自動遞增的主鍵(pk)。
我不知道你的順序,但這個例子應該給你一個想法。
Select Record,
(Select count(*) From table
Where pk <= t.pk) Priority
From Table t
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.