【问题标题】:Duplicate Data over One-to-Many self relation (Tsql)通过一对多自关系复制数据 (Tsql)
【发布时间】:2010-09-13 06:58:08
【问题描述】:

对不起,如果标题描述不佳,但我现在不能做得更好 =(

所以,我有这个主-细节方案,细节是具有 n 个级别的树结构(一对多自关系)(在 SQLServer 2005 上)

我需要使用存储过程将详细结构从一个主机复制到另一个主机,方法是将源主机 ID 和目标主机 ID 作为参数传递(目标是新的,因此它没有详细信息)。

我遇到了麻烦,请您帮忙寻找一种方法来跟踪父 ID 并在不使用光标或类似讨厌的东西的情况下插入子代...

当然,这是一个示例模型,我想要做的是将详细结构从一个主节点复制到另一个主节点。事实上,我正在使用现有的作为模板创建一个新的主人。

【问题讨论】:

  • 那么你的明细表在同一张表中有自己的明细吗?类似于: MasterID DetailID ParentDetailID ParentDetailID 在哪里引用 Details 表中的一行?
  • 是的,detail.ParentDetailID 是 detail.DetailID 的 FK,detail.MasterID 是 master.MasterID 的 FK
  • 那么 detail.MasterID 是为所有详细信息行填充,还是只为详细信息树的“根”节点填充?
  • 啊——我明白了。我以为您想将详细信息行从一个主节点移动 到另一个主节点,但不明白问题出在哪里。当然复制是一个更难的问题。

标签: sql-server tsql


【解决方案1】:

您必须为少量样本数据提供创建表和插入语句。 以及基于此样本数据的预期结果。

【讨论】:

    【解决方案2】:

    如果我理解问题所在,这可能就是您想要的:

    INSERT dbo.Master VALUES (@NewMaster_ID, @NewDescription)
    
    INSERT dbo.Detail (parent_id, master_id, [name])
    SELECT detail_ID, @NewMaster_ID, [name]
    FROM dbo.Detail 
    WHERE master_id = @OldMaster_ID
    
    UPDATE NewChild
    SET parent_id = NewParent.detail_id
    FROM dbo.Detail NewChild
    JOIN dbo.Detail OldChild
    ON NewChild.parent_id = OldChild.detail_id
    JOIN dbo.Detail NewParent
    ON NewParent.parent_id = OldChild.parent_ID
    WHERE NewChild.master_id = @NewMaster_ID
    AND   NewParent.master_id = @NewMaster_ID
    AND   OldChild.master_id = @OldMaster_ID
    

    诀窍是在初始插入中使用旧的detail_id 作为新的parent_id。然后使用此关系连接回旧的行集,并更新新的 parent_id 值。

    我假设 detail_id 是一个 IDENTITY 值。如果您自己分配,则需要提供详细信息,但有类似的解决方案。

    【讨论】:

    • 哇,这值得一试,谢谢!,我明天就会回来!
    • 它做到了!!,抱歉耽搁了。非常非常感谢。
    • 很高兴为您提供帮助。这是一个有趣的谜题。
    猜你喜欢
    • 2016-04-24
    • 2020-12-30
    • 1970-01-01
    • 2018-08-02
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2018-04-26
    相关资源
    最近更新 更多