我的公司有一个包含项目相关数据的数据库。有时,他们会修改一个项目,保留旧版本并复制它,这样他们就可以使用复制的版本。项目表有一个修订字段,默认为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
语句来获取获取映射。这有点棘手,但仍然可行。如果需要的话,也许最好留给另一个答案。