Я немного упрощаю вашу настройку двумя таблицами: table_a
накопление данных и table_b
, содержащее новые данные.
-- TABLE_A: Primary Key HOUSE_ID, HOUSE_KEY_NBR
create table table_a as
select 1 house_id, 1 house_key_nbr, 90 split from dual union all
select 1 house_id, 2 house_key_nbr, 30 split from dual union all
select 1 house_id, 3 house_key_nbr, 100 split from dual;
-- TABLE_B: new data
create table table_b as
select 1 house_id, 1 house_key_nbr, 5 split from dual union all
select 1 house_id, 1 house_key_nbr, 5 split from dual union all
select 1 house_id, 4 house_key_nbr, 50 split from dual union all
select 1 house_id, 4 house_key_nbr, 40 split from dual union all
select 1 house_id, 5 house_key_nbr, 100 split from dual;
Важным моментом является то, что table_a
имеет первичный определен ключ, поэтому вам нужно обновить только одну строку для исправления SPLIT
Первый шаг прост: MERGE
новые данные
MERGE INTO table_a a
USING (select HOUSE_ID, HOUSE_KEY_NBR, sum(SPLIT) SPLIT
from table_b
group by HOUSE_ID, HOUSE_KEY_NBR) b
ON (a.HOUSE_ID = b.HOUSE_ID and a.HOUSE_KEY_NBR = b.HOUSE_KEY_NBR)
WHEN MATCHED THEN
update SET a.SPLIT = a.SPLIT + b.SPLIT
WHEN NOT MATCHED THEN
insert (HOUSE_ID, HOUSE_KEY_NBR, SPLIT)
values (b.HOUSE_ID, b.HOUSE_KEY_NBR, b.SPLIT)
Итак, в основном вы сначала агрегирует новые данные до уровня PK, а затем с помощью MERGE
либо вставляет, либо обновляет table_a
. На втором этапе выполните исправление, используя тот же подход с MERGE
, только используйте другой исходная таблица, содержащая только отклонение SPLIT от 100.
MERGE INTO table_a a
USING (select HOUSE_ID, HOUSE_KEY_NBR, 100 - sum(SPLIT) SPLIT
from table_a
group by HOUSE_ID, HOUSE_KEY_NBR
having sum(SPLIT) != 100) b
ON (a.HOUSE_ID = b.HOUSE_ID and a.HOUSE_KEY_NBR = b.HOUSE_KEY_NBR)
WHEN MATCHED THEN
update SET a.SPLIT = a.SPLIT + b.SPLIT
WHEN NOT MATCHED THEN
insert (HOUSE_ID, HOUSE_KEY_NBR, SPLIT)
values (b.HOUSE_ID, b.HOUSE_KEY_NBR, b.SPLIT)
После этого шага все SPLIT
равны 100
select HOUSE_ID, HOUSE_KEY_NBR, sum(SPLIT)
from table_a
group by HOUSE_ID, HOUSE_KEY_NBR
order by 1,2;
HOUSE_ID HOUSE_KEY_NBR SUM(SPLIT)
---------- ------------- ----------
1 1 100
1 2 100
1 3 100
1 4 100
1 5 100
Если вы не хотите MERGE
в table_a
, а вы используете только INSERT
, я бы бросил вызов этому дизайну, потому что неясно, какую из многих записей с тем же ключом вы хотите обновить.
Я рекомендую не UPDATE
но до INSERT
дополнительных строк с исчислением лат. разница SPLIT.