Oracle关联两张表批量修改某个字段
程序员文章站
2024-01-26 21:49:10
有两张表A、B,需要关联这两张表,对表A中的某个字段,批量进行更新。一、业务描述: 现有表A、B分别存储用户基本信息,且有主键可以关联。因为数据新旧等关系,表A、B中的数据不一致(表A,标红的内容),比如姓名、性别等,且表B中的信息是准确的。现有视图A,需要从表A中获取数据,因此,需要关联表B,对表A中的姓名、性别进行校对(更新)二、数据表结构表A主键:user_id,字段:name,age,sexuser_idnameagesex001佚名18岁男002....
有两张表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