首页 > 解决方案 > 如何使用 Merge 同步目标表

问题描述

如何使用 Merge 使表格同步。

我有两张桌子:SourceTarget。我希望表在查询完成后Target同步。Source

以下是两个表的列。我希望所有列都Contact_noTarget表同步。

最初我会将 3 列数据复制到Target表 where 中Action = 'I'

源表

Unique_ID   Part_no     Country_Code Contact_no
1           123             IN        12121212
2           456             US        65467987  
3           678             CH        65465465
4           897             EN        56546544  

目标表

Unique_ID   Part_no     Country_Code    Action
1           123             IN            I
2           456             US            I 
3           678             CH            I
4           897             EN            I

SQL 运行后,它将Target根据Source表的Action标志更新、插入或删除表。

次日源表已更改

Unique_ID   Part_no     Country_Code Contact_no
1           123             US        12121212  -- Updated Country_Code as "US"
2           456             US        65467987  -- No Change
3           678             CH        56565656  -- Deleted from Source
4           897             EN        56546544  -- No Change
5           114             DL        11111111  -- New Inserted

目标表

Unique_ID   Part_no     Country_Code    Action
1           123             US            U
2           456             US            I 
3           678             CH            D     -- Deleted from Source
4           897             EN            I
5           114             DL            I     -- Newly Inserted

我在 Merge 语句下面写了,但它不能正常工作,在使用Action标志“I”进行初始插入后,当我执行时,即使我只更新了Source表中的一条记录,它也会更新所有动作标志为“U”的记录。

MERGE INTO Target d2
USING (SELECT Unique_id, Part_no, Country_code 
       FROM Source
       UNION ALL
       SELECT a.Unique_id, a.Part_no, a.Country_code
       FROM Target a LEFT JOIN Source b ON a.Unique_id=b.Unique_id
       WHERE b.Unique_id IS NULL 
       ) d
ON (d2.Unique_id=d.Unique_id)
WHEN NOT MATCHED THEN
   INSERT(Unique_id, Part_no, Country_code, Action)
   VALUES(d.Unique_id, d.Part_no, d.Country_code, 'I')
WHEN MATCHED THEN
   UPDATE SET d2.Action = 'U', d2.Country_code = d.Country_code;
-- DELETE WHERE d2.loc='DELETE ME';

请帮我解决这个问题。

标签: sqloraclesql-merge

解决方案


推荐阅读