Oracle两(多)表关联更新操作
在实际项目中经常会碰到一个表的数据update依赖其它表数据的情况。
方式一:update…set…where exists…
例如现在有两个表:客户表(customers)和vip客户表(cust_city)。
第一种情况:被update的值是固定的,仅在where条件句中有关联。
update customers a
set customer_type='01' --01为vip,00为普通
where exists (
select 1 from cust_city b
where b.customer_id = a.customer_id
)
第二种情况:被update的值由另一个表中的数据运算而来。
update一列的情况:
update customers a
set city_name=(select b.city_name from cust_city b where b.customer_id = a.customer_id)
where exists (
select 1 from cust_city b
where b.customer_id = a.customer_id
)
注意事项
上面的 where exists 的语句是不能省略的,否则会导致一些没有匹配的行会被更新成null值。
举个例子,有如下T1和T2两张表。
select * from T1;
select * from T2;
现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致。如果没有加 where exxits 语句,执行如下update语句。
UPDATE T1
SET T1.FMONEY = (select T2.FMONEY from T2 where T2.FNAME = T1.FNAME)
得到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);
验证更新后T1的数据:
方式二:merge into…when matched…
还是对于上面t1,t2两张表做联表更新,merge语句的使用方式如下:
merge into t1
using (select t2.fname,t2.fmoney from t2) t
on (t.fname = t1.fname)
when matched then
update set t1.fmoney = t.fmoney;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具