文章目录

  • 声明
  • 一 准备阶段
    • 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中如何用一个表的数据更新另一个表中的数据_转载相关推荐

  1. MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表

    MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表 有两张表,info1, info2 . info1: info2: 方式一:要用info2中的 ...

  2. 达梦工作笔记-将A表的ID插入到B表,将A表的数据更新到B表

    目录 前言 将A表的ID插入到B表 将A表的数据更新到B表 前言 这里的语法,和Mysql有点点不一样,达梦数据库在简单语法上和Mysql一样,但在复制的语法上没有Mysql那样灵活,这里用的是DM7 ...

  3. oracle大于或等于,如何用SQL实现最接近某一个值且大于等于这个值的一条记录

    測試如下: SQL>  select col1,col2,to_char(col3,'yyyy-mm-dd am hh:mi:ss') from test_10; COL1       COL2 ...

  4. mysql数据库导入到excel表格数据_[转载]将EXCEL表格中的数据导入mysql数据库表中(两种方法)...

    今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...

  5. android 中如何用aes算法加密解密zip文件,android中AES加解密的使用方法

    今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行.不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上绝大多数的例子都是行不通 ...

  6. oracle中把一个表中的数据更新到新表中

    create table 表名 as select * from 原表名: 这样是把老表的数据及表结构复制到新表.

  7. oracle表空间放在别的服务器,OracleXE的APEX可以访问同一服务器上的另一个Oracle数据库(10g),还是受限于XE数据库中的那些用户/表空间?...

    之前我已经完成了这个,我们无法访问托管要处理的数据的实际数据库,以保存标准端口1521侦听器访问权限 . 当时的Apex对于组织而言是新的,DBA也将使用他们的数据库服务器作为网络服务器网关也有一个伏 ...

  8. oracle中join另一个表后会查询不出一些数据_面试必备 | 8个Hive数据仓工具面试题锦集!...

    是新朋友吗?记得先点蓝字关注我哦- 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析  人工智能+Python | 人工智能+物联网 进入数据时代,大数据技术成为互联网发 ...

  9. python dataframe批量将列名加后缀_Python中的dataframe对象如何用相同的列名堆叠两个表,并从行堆叠它们以形成一个表,Dataframe,将,具有,叠加,起来,上,组成...

    Python中Dataframe对象如何将两个具有相同列名的表叠加起来,从行上叠加起来,组成一个表. 例如,有两个表,表的列名是相同的.如何将一个条的记录添加的另一个表的记录下面,形成一个新的表? 举 ...

最新文章

  1. php虚拟内存设置,虚拟内存有什么用
  2. STP 简介----PVST+ RSTP和快速PVST+ (1)
  3. java获取请求的url地址
  4. 安装JDK,如何配置PATH,如何配置CLASSPATH
  5. 如何设计实时数据平台(技术篇)
  6. java udp 接收16进制,java udp接收16进制乱码
  7. 三星手机com.android.systemservice卸载,完美卸载 系统程序卸载就用System App Remover
  8. OPPO手机修改服务器,OPPO手机IP地址在哪里查看?IP地址怎么修改?
  9. JS奇谋诡计——16 Hacks
  10. linux下/proc/sysrq-trigger详解
  11. 基本数据类型和内置方法 08
  12. KIS与KAV,KAV personal与KAV pro的区别!
  13. python股票分析之放量跌倒底买入2.0
  14. 手撕包菜php,包菜怎么做爽脆不出水,教你简单小技巧,营养健康,家里人都喜欢...
  15. 人工智能 | 自然语言处理研究报告(人才篇)
  16. Linux:python捕获异常,模板,文件以及数据存储
  17. 公元前,公元后纪年区别
  18. 《Ce train qui s’en va 离站的火车》
  19. PDF复制翻译自动去掉换行(谷歌/百度/有道/DeepL)
  20. 【操作系统】Windows 下隐藏电脑磁盘符

热门文章

  1. 【练习】获取新浪搜索中的热搜榜的标题
  2. 腾讯云云硬盘快速入门-挂载云硬盘
  3. LeetCode-171. Excel 表列序号(java)
  4. node生成唯一设备id(node-machine-id)
  5. PO(PageObject)模型
  6. OsmocomBB SMS Sniffer
  7. ElasticSearch教程——proximity match 近似匹配
  8. symlink() 函数
  9. Win 10 开机出现no bootable device
  10. CTF--web学习