我需要将供体表中的数据合并到两个目标表中。结构如下。如果在跟踪表中找不到projid,则需要在组件表中创建新组件,并使用新的ID插入到跟踪表中。此外,对于供体表中不再存在的那些项目,跟踪表的“活动”列应标记为0。我可以在单个merge语句中实现此功能吗?
供体表
projid | datestamp | Ownerid ------------------------------------------------- c_abc 1-jan-2013 name1 c_def 2-jan-2013 name3 c_ghi 3-jan-2013 name4
跟踪表
compid |projid |active | ... ----------------------------------------------- 123 c_abc 1 124 c_xyz 1 125 c_def 1
成分表
compid |ownerid ------------------------- 123 name1 124 name2 125 name3
合并后的输出表:
compid |ownerid ------------------------- 123 name1 124 name2 125 name3 126 name4
compid |projid |active | ... ----------------------------------------------- 123 c_abc 1 124 c_xyz 0 125 c_def 1 126 c_ghi 1
从理论上讲,应该有一个解决方案可以在单个语句中执行此操作,但是到目前为止,我还没有找到它。*
这是使用两个MERGE语句可以完成的方法:
MERGE
WITH CTE_trgt AS ( SELECT c.compid, c.ownerid, t.projid, t.active FROM component c INNER JOIN trace t ON c.compid = t.compid ) MERGE CTE_trgt t USING Donor s ON t.projid = s.projid WHEN NOT MATCHED BY TARGET THEN INSERT (ownerid) VALUES (s.ownerid) OUTPUT INSERTED.compid, s.projid, 1 INTO trace; MERGE trace t USING Donor s ON t.projid = s.projid WHEN NOT MATCHED BY SOURCE THEN UPDATE SET t.active = 0;
SQLFiddle演示
*具有更新活动列的部分:
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET t.active = 0
应该能够适合上面的查询,为所有操作创建单个merge语句,但是会引发错误:
视图或函数“ t”不可更新,因为修改会影响多个基表
即使它显然是单列,并且定期进行非合并更新也可以。也许有人知道原因和/或解决方法。