Sql 如何使用合并同步目标表

Sql 如何使用合并同步目标表,sql,oracle,sql-merge,Sql,Oracle,Sql Merge,如何使用合并同步表 我有两个表:Source和Target。我希望在查询完成后,Target表与Source同步 以下是两个表的列。我希望除联系人_no之外的所有列与目标表同步 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

如何使用合并同步表

我有两个表:
Source
Target
。我希望在查询完成后,
Target
表与
Source
同步

以下是两个表的列。我希望除
联系人_no
之外的所有列与
目标
表同步

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';
最初,我将把3列数据复制到
Target
表中,其中
Action='I'

源表 目标表 SQL运行后,它将根据
表中有关
操作
标志的内容更新、插入或删除
目标

第二天源表更改 目标表 我已经写了下面的Merge语句,但它不能正常工作,在使用
Action
标志“I”进行初始插入之后,当我执行时,它正在更新所有记录,并将Action标志设置为“U”,即使我只更新了
Source
表中的一条记录

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';

请帮我解决这个问题。

您使用的是Oracle数据库还是MySQL?MySQL中没有PL/SQL。SQL Developer与您的问题无关,即使您正在使用它来开发代码。我的错,它被错误地添加了,我使用的是Oracle数据库您的内部联合所有查询可能是罪魁祸首。请仅使用左连接查询进行尝试。
union all
target
添加到
source
集合的目的是什么?这些行在
unique\U id
上匹配,所以您将它们更新为
'U'
。我添加了union,因为如果在源表中更新了任何记录,我也需要它们。但我认为只选择不会起作用。您使用的是Oracle数据库还是MySQL?MySQL中没有PL/SQL。SQL Developer与您的问题无关,即使您正在使用它来开发代码。我的错,它被错误地添加了,我使用的是Oracle数据库您的内部联合所有查询可能是罪魁祸首。请仅使用左连接查询进行尝试。
union all
target
添加到
source
集合的目的是什么?这些行在
unique\U id
上匹配,所以您将它们更新为
'U'
。我添加了union,因为如果在源表中更新了任何记录,我也需要它们。但我认为只有选择不会起作用。
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 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';