Oracle关联两张表批量修改某个字段

有两张表A、B,需要关联这两张表,对表A中的某个字段,批量进行更新。

一、业务描述: 现有表A、B分别存储用户基本信息,且有主键可以关联。因为数据新旧等关系,表A、B中的数据不一致(表A,标红的内容),比如姓名、性别等,且表B中的信息是准确的。现有视图A,需要从表A中获取数据,因此,需要关联表B,对表A中的姓名、性别进行校对(更新)

二、数据表结构

表A
主键:user_id,字段:name,age,sex

user_idnameagesex
001佚名18岁
002匿名19岁
003未知20岁
004匿名21岁

表B
主键:user_id,字段:name,age,sex

user_idnameagesex
001张三18岁1
002李四19岁2
003王五20岁1
004赵六21岁1

视图A

用户编号姓名年龄性别联系方式家庭住址……
001张三18岁
002李四19岁
003王五20岁
004赵六21岁
create view A as
select * from table_a;

三、关联A、B表,批量更新A表某字段的语句

UPDATE table_a t1 
SET t1.name= (SELECT max(t2.name)
               FROM table_b t2
               WHERE t1.user_id= t2.use_id)
WHERE t1.user_id> 0
AND EXISTS (SELECT t2.name
            FROM table_b t2
            WHERE t1.user_id= t2.user_id);

四、实现效果

create view A as

select 

t1.user_id,
nvl(t1.name,t2.name), --同时从A,B表取姓名,A表优先,保证视图A中name不为空
nvl(t1.age,t2.age),--同时从A,B表取年龄,A表优先,保证视图A中age不为空
CASE --同时从A,B表取性别,A表优先,A表值为空时,取B表,并做性别转换,保证视图A中sex不为空
     WHEN t1.sex is not null then
          t1.sex
          when  t1.sex is null then
            case
              when t2.sex =1 then
                '男'
                when t2.sex =2 then
                  '女'
                  else
                    '--'
           END
       END AS SEX

from table_a t1,table_b t2;

关联A、B更新后,获取到了正确的姓名和性别。

用户编号姓名年龄性别联系方式家庭住址……
001张三18岁
002李四19岁
003王五20岁
004赵六21岁

五、批量更新常见问题

  • 无法修改与非键值保存表对应的列
    原因:直接使用update a …… left jion b on a.id = b.id 之类的语句更新a表时,表b的id不是主键,导致条件查询的结果不唯一,无法进行更新。
  • 单行子查询返回多个结果
    原因:更新语句中的条件查询,返回了不唯一的结果行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jerryzhou;

您的鼓励,将是我的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值