Oracle两表关联更新

T1 表
FNAME FMONEY
A 20
B 20
T2 表
FNAME FMONEY
C 10
D 20
A 100

需求:参照T2表,更新T1表 FMONEY 列的内容,两表关联字段为 FNAME。


方法一:直接update

常见错误

UPDATE T1 
SET T1.FMONEY = (select T2.FMONEY from T2 where T2.FNAME = T1.FNAME)

执行结果:可以看到,T2 表中没有而T1 表中存在的 “FNAME列的B” ,被错误修改为null。

在这里插入图片描述

上述sql语句错误在于,没有限定更新范围,因此是对 T1表 全表进行更新。

正确写法

UPDATE T1 
SET T1.FMONEY = (select T2.FMONEY from T2 where T2.FNAME = T1.FNAME)
WHERE EXISTS(SELECT 1 FROM T2 WHERE T2.FNAME = T1.FNAME);

在这里插入图片描述

如果需要同时更新多个字段,如下所示:
UPDATE 表1 t1
SET (字段一,字段二,…) = (select 字段一,字段二,… from 表2 t2 where t2.关联字段 = t1.关联字段)
WHERE EXISTS(SELECT 1 FROM 表2 t2 WHERE t2.关联字段 = t1.关联字段);

方法二:内联视图更新

UPDATE 
(select t1.fmoney  fmoney1,t2.fmoney  fmoney2 from t1,t2 where t1.fname = t2.fname
)t
set fmoney1 =fmoney2;

方法三:merge更新

merge into t1
using t2
on (t2.fname = t1.fname)
when matched then 
  update  set t1.fmoney = t2.fmoney;

参考
ORACLE 两表关联更新三种方式

你可能感兴趣的:(Oracle,oracle,数据库,sql)