簡體   English   中英

T-SQL修復行順序/序列

[英]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

您可以使用觸發器,它會在刪除完成后自動觸發。 您始終可以從已刪除的值中獲取值。

更多信息

SQL Server ON DELETE觸發器

正如其他人所建議的那樣,如果您一次只刪除一個,只需在刪除后立即更新數字。 如果要立即對整個表重新編號(可能有多個刪除),可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM