3

私のデータベースには、次の 3 つのテーブルがあります。

  • Tasks (TaskID, TaskName, TaskDescription)
  • TaskDetails (TaskID, subTaskPosition, SubTaskID)
  • Subtasks (SubTaskID, Description)

Stored Procedurea を完全に削除してから、もう一方を aSubTaskに再注文するためにa を書き込もうとしています。SubTasksTask

注意事項:

  • TaskDetailsTasks構成要素にリンクしますSubTasks
  • SubTaskは、さまざまなタスクで参照される場合があります。
  • Aは ...Taskの順序付きリストで構成する必要がありSubTasksます。つまり、1,2,3,4 NOT 1,3,4,5 です。

次のように、 aSubTaskとその a へのリンクを削除するのは非常に簡単です。Task

  • DELETE FROM TaskDetails WHERE SubTaskID = @subTaskID
  • DELETE FROM SubTasks WHERE SubTaskID = @subTaskID

ただし、イニシャルが削除されるSubTasksと、テーブル内の他の順序を変更する方法がわかりません。英語では、「削除されたばかりのすべてのタスクについて、削除された行があった場所の後にあるすべてのフィールドから 1 を引きます」を行う必要があります。TaskDetailsSubTaskSubTasksubTaskPosition

助けや指針をいただければ幸いです...

ゴードン

4

3 に答える 3

2

これはそれを行う必要があります:

UPDATE  TaskDetails
SET     subTaskPosition = ROW_NUMBER() OVER(PARTITION BY TaskID  ORDER BY subTaskPosition) 
WHERE   TaskID IN(  SELECT  s.TaskID 
                    FROM    TaskDetails s 
                    WHERE   SubTaskID = @subTaskID)

ループは必要ありません...これは、複数のサブタスクが欠落している場合、または同じタスクに対して既に削除されている場合にも機能することに注意してください。


OK、SQL Server の修正版は次のとおりです。

;WITH
  cteRows As
(
    SELECT  *,
    ROW_NUMBER() OVER(PARTITION BY TaskID  ORDER BY subTaskPosition) As NewPosition
    FROM    TaskDetails
)
UPDATE  cteRows
SET     subTaskPosition = NewPosition
WHERE   TaskID IN(  SELECT  s.TaskID 
                    FROM    TaskDetails s 
                    WHERE   SubTaskID = @subTaskID)

遅れて申し訳ありません ...

于 2012-07-17T00:16:17.963 に答える
2

タスクごとに更新を行う必要があると思います。これでうまくいきます (構文は 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
于 2012-07-17T00:06:30.290 に答える
0

まず、サブ rask の位置を取得し、レコードを削除して更新します。

declare @pos int
select @pos = subTaskPosition from TaskDetails where SubTaskID = @subTaskID
delete ...
delete ...
update TaskDetails set subTaskPosition = subTaskPosition + 1 where SubTaskID = @subTaskID and subTaskPosition > @pos
于 2012-07-17T00:06:08.383 に答える