Использование merge
:
merge into tbl1 tgt
using (select min(column1) column1, column2
from (select column1, column2 from tbl2 union all
select column1, column2 from tbl3)
group by column2) src
on (tgt.column2 = src.column2)
when matched then update set tgt.column1 = src.column1
Допустим, у вас есть эти таблицы:
create table tbl1(column1, column2) as (
select 0, 'A' from dual union all
select 0, 'B' from dual union all
select 0, 'C' from dual union all
select 0, 'D' from dual );
create table tbl2(column1, column2) as (
select 1, 'A' from dual union all
select 41, 'D' from dual );
create table tbl3(column1, column2) as (
select 2, 'B' from dual union all
select 42, 'D' from dual );
У нас есть значение для ключа A
в tbl2
, значение для B
в tbl3
значение для C
отсутствует в обеих исходных таблицах, и у нас есть два проблемных значения для ключа D
.Вы должны решить, что делать в последнем случае, использовать любую функцию агрегирования, например min()
, avg()
или listagg()
для строк.Если такая ситуация невозможна, вы можете упростить мое утверждение, заменив исходный подзапрос простым объединением.
Вы также можете использовать update
, но в этом случае вы должны добавить предложение where
и проверить наличие ключей, чтобы избежать обнуления значений, и это удлиняет код.
Результат merge:
COLUMN1 COLUMN2
---------- -------
1 A
2 B
0 C
41 D