当前位置:网站首页>Oracle中如何用一个表的数据更新另一个表中的数据_转载
Oracle中如何用一个表的数据更新另一个表中的数据_转载
2022-08-11 05:12:00 【小匠石钧知】
文章目录
声明
本文转载自 https://www.cnblogs.com/kangkaii/p/8419088.html
一 准备阶段
1.建表语句
create table table1(
idd varchar2(10) ,
val varchar2(20)
);
create table table2(
idd varchar2(10),
val varchar2(20)
);
2.插入数据
insert into table1 values ('01','1111');
insert into table1 values ('02','222');
insert into table1 values ('02','2222');
insert into table1 values ('03','3333');
insert into table1 values ('04','4444');
insert into table1 values ('06','6666');
commit;
insert into table2 values ('01','aaaa');
insert into table2 values ('02','bbbb');
insert into table2 values ('03','cccc');
insert into table2 values ('04','dddd');
insert into table2 values ('05','eee');
commit;
3.两张表如下图


要将 table2中idd - val 的值,赋值给table1对应的 idd - val;为了验证操作的合理性,设置了如下几个需要额外考虑情况:注意两表特殊地方在于:
- table1中,有1条idd字段值为06的数据,table2中idd字段没有06,命名为 e1;
- table1中,有2条idd字段值都为02,并且对应的val 不同的数据,命名为 e2,以下都能正常解决此情况;
- table2中,有2条idd字段值都为05,但对应的val值不同的数据,命名为 e3,待添加;
二 sql查询
1. 最容易想到的办法:通过子查询 ,直接 update ,如下:
update table1 set table1.val = (select val from table2 where table1.idd = table2.idd);

问题:我们遇到了e1情况,即table1中06对应的值被改变了–>val变成了null(即图中的空白);
这并不是我们的本意,故做出如下改进。
2. 加入限制条件,对于 table1中有值,但是table2中无值的idd字段,不做修改;
update table1 set val = (select val from table2 where table1.idd = table2.idd)
where exists (select 1 from table2 where table1.idd = table2.idd)

第2种写法看似没问题,但如果我们再次向table2中插入一条数据,insert into table2 values ('03','ccc');遇到了e3情况,执行后会报错如下:ORA-01427:单行子查询返回多个行

3. 通过上述分析,简单的更新语句并不能解决遇到的异常情况。所以我们可以使用merge,如下:
merge into table1
using table2
on (table1.idd = table2.idd)
when matched then
update set table1.val = table2.val
虽然可以解决e1情况,然而遇到e3情况时,仍然报错,如下:ORA-30926: 无法在源表中获得一组稳定的行
4. 最后,在3的基础上,加入限制条件,即可解决;
merge into table1
using (select t.idd ,max(t.val) m from table2 t group by t.idd)table2
on (table1.idd = table2.idd)
when matched then
update set table1.val = table2.m
- 上述写法在using后面构造了一个新的table2,但一定要对val做出处理,如果是varchar类型,可以选择 max,min等函数,如果number类型,可以使用sum,avg等函数,总之,要对val做出处理(对应多个的时候,到底要哪个?最大的还是最小的),新的table2是一个idd对应一个val。
- 为什么构造新的table2时要加 group by t.idd ,因为 select max(t.val) m from table2 t 查询的是一条数据,t.idd不属于这条数据的任何字段,故select t.idd 后报错,拼接group by t.idd便可以查出需要的idd字段。(针对oracle数据库,mysql并不会)
边栏推荐
- 论文笔记:BBN: Bilateral-Branch Network with Cumulative Learningfor Long-Tailed Visual Recognition
- 代理模式(简要介绍)
- Application layer protocol - DNS
- How to use svg-icon (svg-sprite-loader plugin)
- 提升你工作效率的技巧,你得知道——Navitcat 快捷键
- 什么是三次握手和四次挥手(清晰易懂)
- MySQL must know and must know (primary articles)
- 元宇宙社交应用,靠什么吸引用户「为爱发电」?
- 【嵌入式开源库】MultiButton的使用,简单易用的事件驱动型按键驱动模块
- 一个月闭关直接面进大厂,这份Android面试笔记是真的牛逼
猜你喜欢

普林斯顿微积分读本05第四章--求解多项式的极限问题

How to use svg-icon (svg-sprite-loader plugin)

论文笔记:BBN: Bilateral-Branch Network with Cumulative Learningfor Long-Tailed Visual Recognition

交换机和路由器技术-25-OSPF多区域配置
![[Embedded open source library] The use of cJSON, an efficient and streamlined json parsing library](/img/11/26ec988a23b239d7b01e2e29e3e32d.png)
[Embedded open source library] The use of cJSON, an efficient and streamlined json parsing library

IP-Guard如何禁止运行U盘程序

网络技能树

Unity WebGL RuntimeError: integer overflow(整数溢出问题)

交换机和路由器技术-21-RIP路由协议

元宇宙社交应用,靠什么吸引用户「为爱发电」?
随机推荐
Kong实现禁止国外IP访问
C Language: Practical Debugging Tips
Smart Pointer Notes
2022年Android面试中最常问的问题是什么?
HAVE FUN | "SOFA Planet" spacecraft plan, the latest progress of source code analysis activities
You must understand - the nine built-in objects and four domain objects of JSP
K8s复习笔记7--Redis单机和Redis-cluster的K8S实现
Paper Notes: BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition
【电商运营】社交媒体营销策略该如何制定?
guava RateLimiter uniform current limit
【无2022上海市安全员A证考试题库及模拟考试
How IP-Guard prohibits running U disk programs
paddlepaddle实现CS_CE Loss且并入PaddleClas
Switch and Router Technology-27-OSPF Route Redistribution
2021年网络规划设计师下午案例题
交换机和路由器技术-24-OSPF单区域配置
[QNX Hypervisor 2.2用户手册]10.16 vdev virtio-blk
一个月闭关直接面进大厂,这份Android面试笔记是真的牛逼
Four functional interfaces
ARM Architecture 4: Embedded Hardware Platform Interface Development