甲骨文:需要存在于相关更新中

Oracle: Need for exists in correlated update

我正在SQL练习下面的link https://oracle-base.com/articles/misc/updates-based-on-queries

在子查询方法中,代码如下

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);

关联部分使用join我能理解,但是EXISTS操作符有什么用。根据文章,它应该排除在更新目标 table 时不匹配的记录。但是那应该通过连接条件来处理,对吧?那只是在源和目标之间具有匹配 id 的记录。这是因为 WHERE 子句是强制性的,以避免更新完整的 table,即使我们在源和目标之间有一个等连接?

如果没有 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