mysql实现多表关联更新的详细方法
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,不知道大家之前对类似mysql实现多表关联更新的详细方法的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完mysql实现多表关联更新的详细方法你一定会有所收获的
千家信息网最后更新 2025年01月22日mysql实现多表关联更新的详细方法
不知道大家之前对类似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 customersset city_name='北京'where customer_id<1000
2) 两表(多表)关联update -- 仅在where字句中的连接
--这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别update customers a -- 使用别名set customer_type='01' --01 为vip,00为普通where exists (select 1from tmp_cust_city bwhere 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 1from tmp_cust_city bwhere b.customer_id=a.customer_id)-- update 超过2个值update customers a -- 使用别名set (city_name,customer_type)=(select b.city_name,b.customer_typefrom tmp_cust_city bwhere b.customer_id=a.customer_id)where exists (select 1from tmp_cust_city bwhere b.customer_id=a.customer_id)
注意在这个语句中,
(select b.city_name,b.customer_typefrom tmp_cust_city bwhere b.customer_id=a.customer_id)与(select 1from tmp_cust_city bwhere 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实现多表关联更新的详细方法这篇文章,大家觉得怎么样?如果想要了解更多相关,可以继续关注我们的行业资讯板块。
客户
方法
关联
更新
信息
别名
部分
城市
所在
业务
子系统
字句
数据
北京
服务
普通
简便
主动
另当别论
这不
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器的安全视频
我的世界服务器怎么加材质包
青县网络技术
网络安全知识手册2017
猎豹加速器的服务器地址怎么找
山东网络安全周从哪年开始
kepware服务器管理
Thinkphp数据库兼容
怎样投资软件开发企业
软件开发个人成长
山东省高考填报志愿的网络安全性
饭圈乱象网络安全漫画怎么画
XP系统连接数据库失败
软件开发购买什么
供热收费管理软件开发论文
苹果手机是苹果服务器发的吗
服务器开启了自动续费多久能使用
昆仑通态如何上传数据库
网络安全部头像
微服务抽离公共数据库配置
惠普打印机设置web服务器
网络安全评标专家
东城二手服务器回收行情价格
网络安全大赛奖金有多少
方舟可以在哪个服务器开麦
java 连接远程数据库
数据库如何统计每月的交易量
镇海ios软件开发设计
软件开发价格评审
手机软件开发选什么专业