2011-04-13 58 views
4

我有一個包含任務級別爲子任務的典型分層數據的表。 PARENTID是根級的任務NULL如何複製分層數據

CREATE TABLE [dbo].[tblTask](
    [TaskID] [int] IDENTITY(1,1) NOT NULL, 
    [TaskDescription] [nvarchar](255) NOT NULL, 
    [TaskStatusID] [int] NOT NULL, 
    [ParentID] [int] NULL 
) 

在每個月初,我需要複製新的TaskID的對於未完成每個任務的層次結構(TaskStatusID == Complete),然後關閉所有原始任務。爲了節省自己的悲痛,我的第一個傾向將是在c#中解決這個問題,我比SQL有更高的精通度,但是我想首先試着瞭解是否有一種直接在數據庫中解決這個問題的好方法。

更新:@Abe我不確定你需要什麼樣的數據,特別是沒有所需的輸出。我需要複製表中的結構,但新的TaskID's。這是針對SQL Server的。

@thursdaysgeek假設如果父任務完成,則所有子任務也完成。規則是如果一個根任務的子任務全部完成,那麼我可以設置根任務完成。否則,如果一個父任務沒有完成,但子任務是,那麼我只需要複製父母而不是孩子。希望有所幫助。

+0

你能給我們提供你的樣品數據和所需的輸出嗎?另外,這是什麼DBMS? – 2011-04-13 21:37:44

+0

是否有可能有一個不完整的子任務和父任務是?如果是這樣,那麼兩者都需要重複?如果您有一個不完整的父任務和一個子任務,那麼只有父任務需要重複? – thursdaysgeek 2011-04-13 21:43:05

+0

一個好的方法是用C#(或僞C#)寫出來並在這裏發佈結果。然後請求幫助將該算法轉換爲SQL。 – 2011-04-13 22:37:25

回答

5

一種方法是修改您的表結構並添加類似通常爲NULL的CopiedFromTaskID列。

每個月,您複製每個任務未完成的所有行,並且在插入這些新行時,您還將CopiedFromTaskID列更新爲每行復制的任務的ID。這可以讓您將新行綁定到從其複製的行。

INSERT INTO 
    tblTask (TaskDescription, TaskStatusID, ParentID, CopiedFromTaskID) 
SELECT TaskDescription, TaskStatusID, ParentID, TaskID 
FROM tblTask 
WHERE TaskStatusID <> Complete --Note pseudo code here 

下一步,運行SQL來改變這些新插入的行的ParentId。既然你有CopiedFromTaskID,你可以用它來更新PARENTID以反映新的價值,因爲在這個SQL:

UPDATE 
    tblTask 
SET 
    tblTask.ParentID = InlineTable.NewTaskID 
FROM 
    tblTask INNER JOIN 
    (
     SELECT TaskID AS NewTaskID, 
       CopiedFromTaskID AS OldTaskID 
     FROM tblTask 
     WHERE CopiedFromTaskID IS NOT NULL 
    ) AS InlineTable ON tblTask.TaskID = InlineTable.OldTaskID 
WHERE 
    tblTask.CopiedFromTaskID IS NOT NULL 

最後,您更新表一次,以使所有的CopiedFromTaskID值空,因此它會準備好你運行它下一次:

UPDATE 
    tblTask 
SET CopiedFromTaskID = NULL 
WHERE CopiedFromTaskID IS NOT NULL 

你想要運行在存儲過程的事務內部的所有這些步驟,但它實現了你想要的東西,而不光標/循環和在數據庫中。顯然,您需要拋出SQL語句以「關閉」所有原始任務。

+0

這聽起來像一個很好的選擇肖恩,謝謝。 – 2011-04-14 06:11:18

+0

@shawn +1,比嵌套遊標更好! – 2015-10-28 17:45:56