一对多自我关系(Tsql)上的重复数据

时间:2020-03-06 14:45:16  来源:igfitidea点击:

抱歉,标题的描述性很差,但是我现在不能做得更好=(

因此,我有这个主从方案,细节是具有n个级别的树结构(一对多自相关)(在SQLServer 2005上)

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

我遇到了麻烦,请我们寻求帮助,以找到一种跟踪父代ID的方法,并在不使用游标或者类似此类讨厌内容的情况下插入子代...

问题的表格模型http://i38.tinypic.com/2vs3n7d.jpg

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

解决方案

我们将必须提供create table并将其插入到少量样本数据的语句中。
和基于此样本数据的预期结果。

如果我了解问题所在,则可能是我们想要的:

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值。如果我们自己分配它们,则需要提供详细信息,但是有一个类似的解决方案。