两表(多表)关联update的写法

本文分享了一个在数据库操作中遇到的多表关联update问题,通过将错误的SQL语句修正为适用于Oracle环境的形式,成功解决了任务需求。同时提供了一个MySQL应用示例,帮助读者理解和应用此解决方案。

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

两表(多表)关联update的写法_SQL技巧
发布于:软件开发网 来源:互联网 作者:佚名 时间:2009-01-01 点击:157

 

今天凌晨因为要在数据库里做一些操作,是关于两表关联的update,但语句怎么写都不正确,老是报错,于是心惊肉跳(就怕不能及时完成操作)去查了一下,NND,原来把SQL写成了在SQL Server下面的特有形式,这种语法在Oracle下面是行不通的,急忙改回来,及时完成了任务。顺便也把查到的SQL帖出来,哪天再忘记了,也好在这里找回来:

软件开发网

update customers a
set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)

 

-- update 超过2个值
update customers a
set (city_name,customer_type)=(select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)

 

 

这是我在mysql的应用,参考了上面的语法.
update t_wb_worldcup_guess g set username=(select  u.name from t_wb_user as u where u.uid=g.userid ) where exists (select 1 from t_wb_user u where u.uid = g.userid)

 

 

### Oracle UPDATE 关联更新语法 在Oracle数据库中,关联更新可以通过种方式实现。一种常见的方式是在`SET`子句中使用子查询来指定要更新的列值[^2]。 对于较为复杂的场景,可以采用创建临时视图的方式来简化SQL语句逻辑并提高性能。具体做法是利用括号内的子查询作为虚拟参与联接操作,在此过程中需注意确保目标与其他辅助间存在唯一匹配关系以防止意外的数据覆盖[^3]。 另外还有一种基于MERGE命令的独特解决方案,该方法不仅支持单条记录插入/删除功能,同时也适用于跨个源同步变更至单一目的实体的情况。不过这里主要讨论标准形式下的UPDATE指令应用实例[^1]。 #### 使用子查询进行关联更新 下面给出一段Python风格伪代码示如何构建这样的查询: ```sql UPDATE target_table t1 SET (column1, column2) = ( SELECT s.columnA, s.columnB FROM source_table s WHERE s.key_column = t1.key_column AND /*其他必要条件*/ rownum = 1 -- 如果预期有行满足则取第一条 ) WHERE EXISTS( SELECT 'X' FROM source_table s2 WHERE s2.key_column = t1.key_column AND /*相同或其他过滤条件*/ ); ``` 上述脚本展示了怎样安全有效地完成一次涉及两个不同格之间的字段映射过程;其中特别强调了仅当确实有必要时才触发实际更改动作的设计考量[^4]。 #### 利用FROM子句增强可读性的KES写法示例 另一种更加直观易懂的形式被称为“KES”的达模式,它允许直接在`FROM`部分声明额外的关系对象以便于后续参照: ```sql UPDATE system.ACCURATE B SET B.sid = T.sid, FROM system.ACCURATE_res2 T , (SELECT COL_A , count(1) FROM system.ACCURATE b GROUP BY COL_A HAVING count(1)=1 ) C WHERE B.COL_A=C.COL_A AND T.COL_A=B.COL_A; ``` 这段示范说明了通过引入中间聚合结果集C以及原始对照组T共同作用下实现了特定条件下对ACCURATE内sid属性的有效刷新[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值