我公司有一个包含项目相关数据的数据库。有时,他们希望修改项目,保留旧版本并复制它,以便他们可以处理复制版本。项目表有一个修订字段,默认为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中的所有行。
我如何做到这一点。
答案 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
语句来获取映射。相当棘手,但仍然可行。如果需要,可能最好留给不同的答案。