Как синхронизировать таблицу с помощью Merge.
У меня есть две таблицы: Source
и Target
. Я хочу, чтобы таблица Target
была синхронизирована с Source
после завершения запроса.
Ниже приведены столбцы для обеих таблиц. Я хочу, чтобы все столбцы, кроме Contact_no
, были синхронизированы с таблицей Target
.
Изначально я скопирую данные из трех столбцов в таблицу Target
, где 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», когда я выполняю, он обновляет все записи с флагом действия как «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';
Пожалуйста, помогите мне с этим.