Без exists
вы будете обновлять каждую строку в dest_tab
. Таким образом, если в dest_tab
есть какие-либо строки, а в source_tab
нет соответствующих строк, столбцы будут иметь нулевое значение:
create table t1 (
c1 int, c2 int
);
create table t2 (
c1 int, c2 int
);
insert into t1 values ( 1, 1 );
insert into t1 values ( 2, 2 );
insert into t2 values ( 1, 999 );
commit;
update t1
set c2 = (
select c2 from t2
where t1.c1 = t2.c1
);
select * from t1;
C1 C2
1 999
2 <null>
Добавление предложения exists
позволяет избежать этой проблемы:
rollback;
update t1
set c2 = (
select c2 from t2
where t1.c1 = t2.c1
)
where exists (
select null from t2
where t1.c1 = t2.c1
);
select * from t1;
C1 C2
1 999
2 2