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