Oracle中如何用一个表的数据更新另一个表中的数据_转载
文章目录
- 声明
- 一 准备阶段
- 1.建表语句
- 2.插入数据
- 3.两张表如下图
- 二 sql查询
- 1. 最容易想到的办法:通过子查询 ,直接 update ,如下:
- 2. 加入限制条件,对于 table1中有值,但是table2中无值的idd字段,不做修改;
- 3. 通过上述分析,简单的更新语句并不能解决遇到的异常情况。所以我们可以使用merge,如下:
- 4. 最后,在3的基础上,加入限制条件,即可解决;
声明
本文转载自 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并不会)
Oracle中如何用一个表的数据更新另一个表中的数据_转载相关推荐
- MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表
MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表 有两张表,info1, info2 . info1: info2: 方式一:要用info2中的 ...
- 达梦工作笔记-将A表的ID插入到B表,将A表的数据更新到B表
目录 前言 将A表的ID插入到B表 将A表的数据更新到B表 前言 这里的语法,和Mysql有点点不一样,达梦数据库在简单语法上和Mysql一样,但在复制的语法上没有Mysql那样灵活,这里用的是DM7 ...
- oracle大于或等于,如何用SQL实现最接近某一个值且大于等于这个值的一条记录
測試如下: SQL> select col1,col2,to_char(col3,'yyyy-mm-dd am hh:mi:ss') from test_10; COL1 COL2 ...
- mysql数据库导入到excel表格数据_[转载]将EXCEL表格中的数据导入mysql数据库表中(两种方法)...
今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...
- android 中如何用aes算法加密解密zip文件,android中AES加解密的使用方法
今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行.不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上绝大多数的例子都是行不通 ...
- oracle中把一个表中的数据更新到新表中
create table 表名 as select * from 原表名: 这样是把老表的数据及表结构复制到新表.
- oracle表空间放在别的服务器,OracleXE的APEX可以访问同一服务器上的另一个Oracle数据库(10g),还是受限于XE数据库中的那些用户/表空间?...
之前我已经完成了这个,我们无法访问托管要处理的数据的实际数据库,以保存标准端口1521侦听器访问权限 . 当时的Apex对于组织而言是新的,DBA也将使用他们的数据库服务器作为网络服务器网关也有一个伏 ...
- oracle中join另一个表后会查询不出一些数据_面试必备 | 8个Hive数据仓工具面试题锦集!...
是新朋友吗?记得先点蓝字关注我哦- 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析 人工智能+Python | 人工智能+物联网 进入数据时代,大数据技术成为互联网发 ...
- python dataframe批量将列名加后缀_Python中的dataframe对象如何用相同的列名堆叠两个表,并从行堆叠它们以形成一个表,Dataframe,将,具有,叠加,起来,上,组成...
Python中Dataframe对象如何将两个具有相同列名的表叠加起来,从行上叠加起来,组成一个表. 例如,有两个表,表的列名是相同的.如何将一个条的记录添加的另一个表的记录下面,形成一个新的表? 举 ...
最新文章
- php虚拟内存设置,虚拟内存有什么用
- STP 简介----PVST+ RSTP和快速PVST+ (1)
- java获取请求的url地址
- 安装JDK,如何配置PATH,如何配置CLASSPATH
- 如何设计实时数据平台(技术篇)
- java udp 接收16进制,java udp接收16进制乱码
- 三星手机com.android.systemservice卸载,完美卸载 系统程序卸载就用System App Remover
- OPPO手机修改服务器,OPPO手机IP地址在哪里查看?IP地址怎么修改?
- JS奇谋诡计——16 Hacks
- linux下/proc/sysrq-trigger详解
- 基本数据类型和内置方法 08
- KIS与KAV,KAV personal与KAV pro的区别!
- python股票分析之放量跌倒底买入2.0
- 手撕包菜php,包菜怎么做爽脆不出水,教你简单小技巧,营养健康,家里人都喜欢...
- 人工智能 | 自然语言处理研究报告(人才篇)
- Linux:python捕获异常,模板,文件以及数据存储
- 公元前,公元后纪年区别
- 《Ce train qui s’en va 离站的火车》
- PDF复制翻译自动去掉换行(谷歌/百度/有道/DeepL)
- 【操作系统】Windows 下隐藏电脑磁盘符