百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> mysql多表关联更新
分享文章到:

mysql多表关联更新

发布时间:08/01 来源:未知 浏览: 关键词:
updatecustomersasetcustomer_type01whereexists(select1fromtmp_citybwhereb.customer_ida.customer_id) 本文分享下,在mysql中实现多表关联更新update的办法,分享一些常用的update多表更新的例子,供大家学习参照 。

举荐课程: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多表关联更新的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板