mysql多表关联更新
举荐课程:MySQL教程。
在某个业务挨理子系统BSS中,
--客户材料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create unique index PK_customers on customers (customer_id)
因为某些缘由,客户所在城市这个信息并不什么正确,但是在客户办事部的CRM子系统中,通过自动办事猎取了局部客户20%的所在城市等正确信息,于是你将该局部信息提取至一张暂时表中:
create table tmp_cust_city ( customer_id number(8) not null, citye_name varchar2(10) not null, customer_type char(2) not null )
1) 最简略的情势
--经确认customers表中所有customer_id小于1000均为'北京' --1000之内的均是企业走向我国以前的本城市的老客户:) update customers set city_name='北京' where customer_id<1000
2) 两表(多表)关联update -- 仅在where字句中的连贯
--这次提取的数据都是VIP,且包含新增的,所以顺便更新客户种别 update customers a -- 运用又名 set customer_type='01' --01 为vip,00为普通 where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id )
3) 两表(多表)关联update -- 被修改值由另一个表运算而来
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 )
注意在这个语句中,
(select b.city_name,b.customer_type from tmp_cust_city b where b.customer_id=a.customer_id ) 与 (select 1 from tmp_cust_city b where b.customer_id=a.customer_id )
是两个独立的子查询,查看施行规划可知,对b表/索引扫描了2篇;
要是放弃where前提,则默许对A表进行全表
更新,但因为(select b.city_name from tmp_cust_city b where where b.customer_id=a.customer_id)
有可能不克不及供给"脚够多"值,由于tmp_cust_city只是一局部客户的信息,
所以报错(要是指定的列--city_name可认为NULL则另当别论):
01407, 00000, "cannot update (%s) to NULL"
// *Cause:
// *Action:
替代的办法:
update customers a -- 运用又名 set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),a.city_name) 或者 set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),'未知') -- 固然这不相符业务逻辑了
一个比拼简捷的办法就是将A表代入 值表达式 中,运用group by 和having 字句查看反复的纪录。
(select b.customer_id,b.city_name,count(*) from tmp_cust_city b,customers a where b.customer_id=a.customer_id group by b.customer_id,b.city_name having count(*)>=2 )
以上就是mysql多表关联更新的细致内容,更多请关注 百分百源码网 其它相干文章!