【问题标题】:How to duplicate hierarchical data如何复制分层数据
【发布时间】:2011-04-14 06:57:28
【问题描述】:

我有一个表,其中包含具有任意级别子任务的任务的典型分层数据。对于根级任务,ParentIDNULL。:

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 == 完成),然后关闭所有原始任务。为了避免悲伤,我的第一个想法是在 c# 中解决这个问题,我比 SQL 更熟练,但我想首先尝试了解是否有直接在数据库中解决这个问题的好方法。

更新:@Abe 我不确定您特别需要什么样本数据,也没有所需的输出。我需要复制表中的结构,但需要使用新的 TaskID。这是针对 SQL Server 的。

@thursdaysgeek 假设如果父任务已完成,则所有子任务也已完成。并且规则是,如果根任务的子任务都完成了,那么我可以设置根任务完成。否则,如果父任务未完成但子任务完成,那么我只需要复制父任务而不是子任务。希望对您有所帮助。

【问题讨论】:

  • 你能给我们你的样本数据和想要的输出吗?另外,这个 DBMS 是干什么用的?
  • 是否有可能有一个未完成的子任务和一个已完成的父任务?如果是这样,那么两者都需要复制吗?如果您有一个未完成的父任务和一个未完成的子任务,那么只需要复制父任务吗?
  • 一个好的方法是用 C#(或伪 C#)写出来,然后在这里发布你的结果。然后寻求帮助将该算法转换为 SQL。

标签: sql tsql


【解决方案1】:

一种方法是修改您的表结构并添加类似 CopiedFromTaskID 列的内容,该列通常为 NULL。

每个月,您都会为每个未完成的任务复制所有行,并且在插入这些新行时,您还会将 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 值都为 NULL,以便下次运行时准备好:

UPDATE
    tblTask
SET CopiedFromTaskID = NULL
WHERE   CopiedFromTaskID IS NOT NULL

您希望在存储过程的事务中运行所有这些步骤,但它可以在没有游标/循环的情况下在数据库中完成您想要的操作。显然,您还需要输入 SQL 语句来“关闭”所有原始任务。

【讨论】:

  • @shawn +1,比嵌套游标好多了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2011-11-22
  • 2015-12-26
  • 2018-11-13
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多