Oracle: потребность в существующем обновлении - PullRequest
0 голосов
/ 11 декабря 2019

Я занимаюсь практикой SQL по ссылке ниже https://oracle -base.com / article / misc / updates-based-on-query

В методе подзапроса кодкак показано ниже

UPDATE dest_tab tt
SET    (tt.code, tt.description) = (SELECT st.code, st.description
                                    FROM   source_tab st
                                    WHERE  st.id = tt.id)
WHERE  EXISTS (SELECT 1
               FROM   source_tab
               WHERE  id = tt.id);

Я могу понять корреляционную часть, используя соединение, но какой смысл использовать оператор EXISTS. Согласно статье, она должна исключать записи, которые не совпадают при обновлении таблицы назначения. Но тогда об этом следует заботиться при условии соединения, верно? Это только записи, которые имеют совпадающий идентификатор между источником и целью. Это потому, что предложение WHERE является обязательным во избежание обновления полной таблицы, даже если у нас есть равное соединение между источником и целью?

1 Ответ

0 голосов
/ 11 декабря 2019

Без 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...