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



我的公司有一个包含项目相关数据的数据库。有时,他们会修改一个项目,保留旧版本并复制它,这样他们就可以使用复制的版本。项目表有一个修订字段,默认为0,当他们单击前端网站上的修订按钮时,应增加一。层次结构看起来像:

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

ProjectID将把我的所有表链接在一起。我有一个包含项目活动的活动表。所以一对多。Activities表将通过ActivityID链接其所有表。

到目前为止,我只想测试一下:

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 

这就是我不知道该怎么办的地方。我需要从Activity_Details表中复制我的所有行,这些行按activityid与我的Activities表相关。但是,我的Activities表中有多行具有相同的ProjectID
因此,它看起来有点像ProjectID=@ProjectID的Activities中的foreach行,获取该行中的Activity ID,复制具有该Activity ID的Activity_Details中的所有行。

我该如何做到这一点。

不需要循环。您需要的是"旧"one_answers"新"活动记录之间的映射,并使用该映射创建具有正确ActivityID的activity_details。

如果您可以在Activities上添加另一个字段,该字段将存储复制记录的最后一个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语句来获取获取映射。这有点棘手,但仍然可行。如果需要的话,也许最好留给另一个答案。

最新更新