gpt4 book ai didi

SQL 存储过程 : Reordering rows after delete

转载 作者:行者123 更新时间:2023-12-01 12:52:20 24 4
gpt4 key购买 nike

在我的数据库中我有如下三个表:

  • 任务(TaskID、TaskName、TaskDescription)
  • TaskDetails(TaskID、subTaskPosition、SubTaskID)
  • 子任务(SubTaskID,描述)

我正在尝试编写一个 Stored Procedure 来完全删除一个 SubTask,然后为一个 重新排序其他 SubTasks任务

注意事项:

  • TaskDetailsTasks 链接到构成 SubTasks
  • SubTask 可以在多个不同的任务中引用。
  • Task 应该由 SubTasks 的有序列表组成...即 1,2,3,4 NOT 1,3,4,5。

删除 SubTask 及其到 Task 的链接相当容易,如下所示:

  • 从 TaskDetails WHERE SubTaskID = @subTaskID 中删除
  • 从子任务中删除 WHERE SubTaskID = @subTaskID

但是,一旦初始 SubTask 被删除,我无法理解如何重新排序 TaskDetails 表中的其他 SubTasks。在英语中,我需要执行以下操作 - “对于刚刚从中删除了 SubTask 的所有任务,从之后出现的所有 subTaskPosition 字段中减去 1删除的行曾经所在的位置。

感谢任何帮助或指点...

戈登

最佳答案

我认为您必须为每项任务进行更新。这可以解决问题(语法适用于 SQL Server):

DECLARE @TaskID int
DECLARE @SubTaskPosition int

DECLARE curSubTaskPositionUpdate cursor fast_forward
FOR
SELECT TaskID, SubTaskPosition
FROM TaskDetails
WHERE SubTaskID = @SubTaskID
OPEN curSubTaskPositionUpdate
FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE TaskDetails
SET SubTaskPosition = SubTaskPosition - 1
WHERE TaskID = @TaskID
AND SubTaskPosition > @SubTaskPosition

FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
END
CLOSE curSubTaskPositionUpdate
DEALLOCATE curSubTaskPositionUpdate

请注意,您在从 TaskDetails 中删除之前执行此操作...并且您可能希望将所有内容包装在事务中。

Gordon Edit - 我必须在更新代码中包含我的删除代码才能使它工作,否则要么 (a) 删除先发生并且“where subtaskID = @subtaskID”不返回任何内容,要么 (b) 我在之后删除重新排序和重新排序(正确!)没有效果。

DECLARE @TaskID uniqueidentifier
DECLARE @SubTaskPosition int

DECLARE curSubTaskPositionUpdate cursor fast_forward
FOR
SELECT TaskID, SubTaskPosition
FROM TaskDetails
WHERE SubTaskID = @subTaskID
OPEN curSubTaskPositionUpdate
FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
WHILE @@FETCH_STATUS = 0
BEGIN
-- Delete the subTask
DELETE FROM TaskDetails
WHERE TaskID = @TaskID
AND SubTaskPosition = @SubTaskPosition

-- Update the other subTasks
UPDATE TaskDetails
SET SubTaskPosition = SubTaskPosition - 1
WHERE TaskID = @TaskID
AND SubTaskPosition > @SubTaskPosition

FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
END
CLOSE curSubTaskPositionUpdate
DEALLOCATE curSubTaskPositionUpdate

关于SQL 存储过程 : Reordering rows after delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11514247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com