Oracle两表关联更新

T1 表
FNAMEFMONEY
A20
B20
T2 表
FNAMEFMONEY
C10
D20
A100

需求:参照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 两表关联更新三种方式

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值