小编典典

将数据合并到两个目标表中

sql

我需要将供体表中的数据合并到两个目标表中。结构如下。如果在跟踪表中找不到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

阅读 163

收藏
2021-04-22

共1个答案

小编典典

从理论上讲,应该有一个解决方案可以在单个语句中执行此操作,但是到目前为止,我还没有找到它。*

这是使用两个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”不可更新,因为修改会影响多个基表

即使它显然是单列,并且定期进行非合并更新也可以。也许有人知道原因和/或解决方法。

2021-04-22