Oracle两张表关联更新的多种方式

本文介绍了Oracle数据库中,如何关联更新两张表的数据。分别展示了通过update单个字段、update多个字段、merge into语句以及使用ROWID游标进行更新的方法。在实际应用中,可以根据需求和性能考虑选择合适的方式,如简单更新推荐使用update,复杂场景可采用merge into或ROWID游标策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟表AA(ID,NAME_A,DEPT_A)    模拟表BB(ID,NAME_B,DEPT_B)

1.update单个字段(注意Oracle与其他数据库不一致,需要多限制一个条件,否则将不匹配的都刷为null)

update AA a set a.NAME_A = (select b.NAME_B from BB b where a.ID=b.ID) where exists (select 1 from BB b where a.ID=b.ID)

2.update多个字段

update AA a set (a.NAME_A,a.DEPT_A) = (select b.NAME_B,b.DEPT_B from BB b where a.ID=b.ID) where exists (select 1 from BB b where a.ID=b.ID)

3.merge into

MERGE INTO AA a
USING (SELECT b.ID,b.NAME_B,b.DEPT_B from BB b) c
ON (a.ID=c.ID  )
WHEN MATCHED THEN
  UPDATE SET a.NAME_A=c.NAME_B,a.DEPT_A=c.DEPT_B

--第二个比第一个更好,特别是针对行级触发器
MERGE INTO AA a
USING (SELECT b.ID,b.NAME_B,b.DEPT_B from BB b group by b.ID,b.NAME_B,b.DEPT_B) c
ON (a.ID=c.ID  )
WHEN MATCHED THEN
  UPDATE SET a.NAME_A=c.NAME_B,a.DEPT_A=c.DEPT_B where a.NAME_A!=c.NAME_B or a.DEPT_A!=c.DEPT_B

4.ROWID游标更新

BEGIN
	FOR cr IN (SELECT a.ROWID,b.NAME_B,b.DEPT_B FROM AA a,BB b WHERE a.ID = b.ID AND (a.NAME_A != b.NAME_B OR a.DEPT_A != b.DEPT_B) )
	LOOP
		UPDATE AA t SET t.NAME_A = cr.NAME_B,t.DEPT_A = cr.DEPT_B WHERE t.ROWID = cr.ROWID;
END LOOP;
END;

 注:以上三种方式按需使用,简单的更新用1、2种即可,考虑到性能问题,或者触发器等其他问题,可以使用第3、4种方式,个人喜欢用merge into

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值