需要在其他表中复制行的相关数据。修改一行

时间:2016-03-08 16:28:02

标签: sql tsql

我公司有一个包含项目相关数据的数据库。有时,他们希望修改项目,保留旧版本并复制它,以便他们可以处理复制版本。项目表有一个修订字段,默认为0,当他们点击前端网站上的修改按钮时,应该增加1。层次结构如下:

Project(ProjectID)
    Project_Details:  (ID) | (ProjectID)
    Activities:  (ID)  |  (ProjectID)
        Activity_Details:  (ID)  |  (ActivitiesID)

ProjectID会将我的所有表链接在一起。我有一个活动表,其中包含项目的活动。所以一对多。活动表将按活动ID链接其所有表。

到目前为止我只是为了测试:

INSERT INTO Project SELECT projectnumber, MAX(Revision)+1 FROM Project Where projectnumber = '23.444.555'
SELECT @@IDENTITY
INSERT INTO ProjectDatails SELECT @@IDENTITY, Rate, Department FROM ProjectDatails where projectid = @projectid 

INSERT INTO Activities SELECT @@IDENTITY, Area_No, Completed_Date FROM Activities where projectid = @projectid 

这是我不知道该怎么做的地方。我需要从Activityid复制Activity_Details表中与Activity活动表相关的所有行。但是,我的Activities表中有多个行具有相同的ProjectID 因此它看起来像带有ProjectID = @projectid的Activities中的foreach行,获取该行中的activityid,使用该activityid复制Activity_Details中的所有行。

我如何做到这一点。

1 个答案:

答案 0 :(得分:0)

无需循环。您需要的是“旧”和“新”活动记录之间的映射,并使用该映射创建具有正确ActivityID的Activity_details。

如果您可以在Activities上添加另一个字段,该字段将存储从中复制记录的 last ActivityID,您可以在连接中使用该字段插入活动详细信息:

INSERT INTO Activities (ProjectID, Area_No, Completed_Date, Last_ActivityID) 
SELECT @newprojectid, Area_No, Completed_Date, ActivityID FROM Activities where projectid = @projectid

INSERT INTO Activity_Details (ActivityID, Details) 
SELECT Activities.ActivityID, Details FROM Activity_Details
    INNER JOIN Activities ON Activity_Details.ActivityID = Activities.Last_ActivityID 
where Activities.projectid = @newprojectid

如果您不能(或不想)添加该字段,则必须依赖MERGE语句来获取映射。相当棘手,但仍然可行。如果需要,可能最好留给不同的答案。