当前位置: 移动技术网 > IT编程>数据库>Oracle > Oracle关联两张表批量修改某个字段

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

2020年07月14日  | 移动技术网IT编程  | 我要评论

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

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

二、数据表结构

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

user_id name age sex
001 佚名 18岁
002 匿名 19岁
003 未知 20岁
004 匿名 21岁

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

user_id name age sex
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不是主键,导致条件查询的结果不唯一,无法进行更新。
  • 单行子查询返回多个结果
    原因:更新语句中的条件查询,返回了不唯一的结果行。

本文地址:https://blog.csdn.net/qq_35206244/article/details/107297634

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网