У меня есть таблица SALARY_MASTER, которая содержит empid
и salary
. Ниже приведена структура таблицы.
EMPID SALARY
------- ------
10001 12000
10002 60000
10003 25000
10004 35000
10005 15000
10006 24000
10007 85000
10008 75000
10009 65000
10010 67000
10011 95000
10012 23000
10013 48000
10014 25000
10015 35000
Другая таблица с именем SALARY_CURRENT
с такими же столбцами. Ниже приведен пример данных.
EMPID SALARY
------- ------
10001 24000
10003 36000
10005 23000
10007 99000
10009 79000
10016 52000
10017 98000
10018 63000
10019 77000
10020 47000
10021 35000
Эта таблица содержит обновленную зарплату для сотрудников. В каждом квартале я получаю эту таблицу от вышестоящих органов, и мне нужно обновлять таблицу SALARY_MASTER
на основе таблицы SALARY_CURRENT
. Поэтому я использовал команду merge
в этом случае. Ниже мое merge
утверждение:
MERGE into SALARY_MASTER SM
USING
SALARY_CURRENT SC
ON
(SM.EMPID = SC.EMPID)
WHEN MATCHED THEN
UPDATE SET SM.SALARY = SC.SALARY
WHEN NOT MATCHED THEN
INSERT (SM.EMPID,SM.SALARY) VALUES(SC.EMPID,SC.SALARY);
После слияния моего SALARY_MASTER
таблица выглядит следующим образом:
EMPID SALARY
------- ------
10001 24000
10002 60000
10003 36000
10004 35000
10005 23000
10006 24000
10007 99000
10008 75000
10009 79000
10010 67000
10011 95000
10012 23000
10013 48000
10014 25000
10015 35000
10016 52000
10017 98000
10018 63000
10019 77000
10020 47000
10021 35000
Я хочу только затронутые строки. Моя выходная таблица будет выглядеть так:
EMPID SALARY STATUS
------- ------- ------
10001 24000 UPDATE
10002 60000 NONE
10003 36000 UPDATE
10004 35000 NONE
10005 23000 UPDATE
10006 24000 NONE
10007 99000 UPDATE
10008 75000 NONE
10009 79000 UPDATE
10010 67000 NONE
10011 95000 NONE
10012 23000 NONE
10013 48000 NONE
10014 25000 NONE
10015 35000 NONE
10016 52000 INSERT
10017 98000 INSERT
10018 63000 INSERT
10019 77000 INSERT
10020 47000 INSERT
10021 35000 INSERT
Или:
EMPID SALARY STATUS
------- ------- ------
10001 24000 UPDATE
10003 36000 UPDATE
10005 23000 UPDATE
10007 99000 UPDATE
10009 79000 UPDATE
10016 52000 INSERT
10017 98000 INSERT
10018 63000 INSERT
10019 77000 INSERT
10020 47000 INSERT
10021 35000 INSERT
Я использую Oracle 11g. Фактическая таблица содержит более 300 тыс. Значений.