У меня есть две таблицы с идентичной структурой t1 и t2.
Таблица t1 имеет примерно на 100+ записей больше, чем t2.
Вот небольшой образец t1.
| pid | tid | amt | paymentdt | paymentmnth | startdate | enddate | updtby
| 670 | 1 | 690.00 | 2015-07-07 | 2015-07-07 | 2015-10-26 14:36:27.000 | 2015-10-26 15:42:42.000 | NULL
| 670 | 11 | 855.00 | 2015-07-07 | 2015-07-07 | 2015-10-26 14:36:27.000 | NULL | NULL
| 670 | 13 | 129.00 | 2015-07-29 | 2015-07-29 | 2015-10-26 14:36:27.000 | NULL | NULL
| 670 | 2 | 855.00 | 2015-09-01 | 2015-09-01 | 2015-10-26 15:42:42.000 | NULL | NULL
| Z41 | 1 | 62.35 | 2015-05-08 | 2015-05-08 | 2015-10-26 10:15:24.000 | 2015-10-26 13:08:05.000 | NULL
| Z41 | 11 | 800.00 | 2015-05-08 | 2015-05-08 | 2015-10-26 10:15:24.000 | NULL | NULL
| Z41 | 2 | 298.00 | 2015-06-01 | 2015-06-01 | 2015-10-26 13:08:05.000 | 2015-10-26 14:36:27.000 | NULL
| Z41 | 3 | 298.00 | 2015-07-01 | 2015-07-01 | 2015-10-26 14:36:27.000 | 2015-10-26 15:15:45.000 | NULL
| Z41 | 4 | 298.00 | 2015-08-01 | 2015-08-01 | 2015-10-26 15:15:45.000 | 2015-10-26 15:42:42.000 | NULL
| Z41 | 5 | 238.00 | 2015-09-01 | 2015-09-01 | 2015-10-26 15:42:42.000 | NULL | NULL
И небольшой образец t2.
| pid | tid | amt | paymentdt | paymentmnt | startdate | enddate | updtby
| 670 | 1 | 690.00 | 2015-07-07 | 2015-07-07 | 2015-10-02 16:10:50.000 | 2015-10-02 16:35:50.000 | NULL
| 670 | 11 | 855.00 | 2015-07-07 | 2015-07-07 | 2015-10-02 16:10:50.000 | NULL | NULL
| 670 | 13 | 129.00 | 2015-07-29 | 2015-07-29 | 2015-10-02 16:10:50.000 | NULL | NULL
| 670 | 2 | 855.00 | 2015-09-01 | 2015-09-01 | 2015-10-02 16:35:50.000 | NULL | NULL
| Z41 | 1 | 298.00 | 2015-07-01 | 2015-07-01 | 2015-10-02 16:10:50.000 | 2015-10-02 16:23:26.000 | NULL
| Z41 | 11 | 800.00 | 2015-05-08 | 2015-05-08 | 2015-10-02 16:10:50.000 | NULL | NULL
| Z41 | 2 | 298.00 | 2015-08-01 | 2015-08-01 | 2015-10-02 16:23:26.000 | 2015-10-02 16:35:50.000 | NULL
| Z41 | 3 | 238.00 | 2015-09-01 | 2015-09-01 | 2015-10-02 16:35:50.000 | NULL | NULL
| 173 | 1 | 785.00 | 2015-07-01 | 2015-07-01 | 2015-10-02 16:16:30.000 | 2015-10-02 16:27:36.000 | NULL
| 173 | 11 | 465.00 | 2015-05-01 | 2015-05-01 | 2015-10-02 16:16:30.000 | NULL | NULL
Теперь сравнение t1 и t2 показывает, что в t1 есть больше значений для pid Z41
, например, tid включают 1, 2, 3, 4 5 и 11. Но в t2 существуют только 1, 2, 3 и 11.
Однако даты начала полностью различаются между t1 и t2, так что это сильно мешает. Ниже показано слияние, которое я пробовал, но в основном он просто вставляет каждую строку с датой начала, отличной от даты t1 в t2.
MERGE INTO t2 AS tgt
USING t1 AS src
ON tgt.pid = src.pid AND
tgt.tid = src.tid AND
tgt.paymentdt = src.paymentdt AND
tgt.paymentmnt = src.paymentmnt AND
tgt.startdate = src.startdate
WHEN MATCHED THEN
UPDATE SET
tgt.amt = src.amt,
tgt.paymentdt = src.paymentdt,
tgt.updatedby = 'MERGEDUPDATE'
WHEN NOT MATCHED THEN
INSERT (pid, tid, amt, paymentdt, paymentmnt, startdate, enddate, updtby)
VALUES (src.pid, src.tid, src.amt, src.paymentdt, src.paymentmnt, src.startdate, src.enddate, 'MERGEDINSERT');
С этим слиянием у меня остались дубликаты pid and tid
, где в столбце updtby
написано «MERGEDINSERT». Но я хочу избежать дублирования.
Как мне правильно выполнить это слияние, чтобы не создавать дубликатов, а вставлять строки, которые существуют в t1, но не в t2, а также обновлять значения
amt, paymentdt, and paymentmnth
, сохраняя startdate?