Перезаписать таблицу, используя FULL JOIN.FULL JOIN
возвращает объединенные записи + не объединенные из левой таблицы + не объединенные из правой таблицы.Вы можете использовать операторы case для реализации вашей логики следующим образом:
insert OVERWRITE table test1
select
--select t1 if both or t1 only exist, t2 if only t2 exists
case when t1.ID is null then t2.ID else t1.ID end as ID,
case when t1.ID is null then t2.NAME else t1.NAME end as NAME,
case when t1.ID is null then t2.CODE else t1.CODE end as CODE,
--if found in t1 but not in t2 then current_date else leave as is
case when (t1.ID is not null) and (t2.ID is null) then current_date else t1.CORRECTED_DATE end as CORRECTED_DATE
from test1 t1
FULL OUTER JOIN test2 t2 on t1.ID=t2.ID;
См. Также этот похожий вопрос об инкрементных обновлениях, ваша логика отличается, но подход тот же: https://stackoverflow.com/a/37744071/2700344
Тестированиес вашими данными:
with test1 as (
select stack (2,
1, 'TEST', 3,null,
29,'TEST2', 90 , null
) as (ID,NAME,CODE,CORRECTED_DATE)
),
test2 as (
select stack (2,
12,'TEST5',20,
1,'TEST',3
) as (ID, NAME, CODE)
)
select
--select t1 if both or t1 only exist, t2 if only t2 exists
case when t1.ID is null then t2.ID else t1.ID end as ID,
case when t1.ID is null then t2.NAME else t1.NAME end as NAME,
case when t1.ID is null then t2.CODE else t1.CODE end as CODE,
--if found in test1 but not in test2 then current_date else leave as is
case when (t1.ID is not null) and (t2.ID is null) then current_date else t1.CORRECTED_DATE end as CORRECTED_DATE
from test1 t1
FULL OUTER JOIN test2 t2 on t1.ID=t2.ID;
Результат:
OK
id name code corrected_date
1 TEST 3 NULL
12 TEST5 20 NULL
29 TEST2 90 2019-03-14
Time taken: 41.727 seconds, Fetched: 3 row(s)
Результат, как и ожидалось.