Oracle中 如何用一个表的数据更新另一个表中的数据

建表语句:

create table table1(

idd varchar2(10) ,

val varchar2(20)

);

create table table2(

idd varchar2(10),

val varchar2(20)

);

插入数据:

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‘);

insert into table2 values (‘05‘,‘eeee‘);

commit;

2表如下:

要将 table2中idd - val 的值,赋值给table1对应的 idd - val;

注意:

  • table1中 有 2个 idd 为 02,val 不同;
  • table2中 有 05,table1中没有;
  • table1中 有 06,table2中没有。

sql语句:

  1. 通过子查询 ,直接 update 更新,如下:

    update table1 set table1.val = (select val from table2 where table1.idd = table2.idd);

  • 问题:对于 table1中idd存在,table2中不存在,val变成了null;
  1. 改进,加入限制条件,对于 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‘);

    即table2 中有一个idd对应多个val,并且在table1中有对应idd时。

  • 执行后会报错:

    ORA-01427:单行子查询返回多个行

  1. 使用merge,如下:

    merge into table1

    using table2

    on (table1.idd = table2.idd)

    when matched then

    update set table1.val = table2.val

  1. 在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,group by idd,但一定要对val做出处理,如果是varchar类型,可以选择 max,min等函数,如果number类型,可以使用sum,avg等函数,总之,要对val做出筛选,新的table2是一个idd对应一个val。

参考:Oracle中用一个表的数据更新另一个表的数据

原文地址:https://www.cnblogs.com/kangkaii/p/8419088.html

时间: 2024-10-11 08:05:45

Oracle中 如何用一个表的数据更新另一个表中的数据的相关文章

Oracle 中用一个表的数据更新另一个表的数据

Oracle 中用一个表的数据更新另一个表的数据 分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报 oraclemergesubqueryinsertnull 有下面两个表:将表tab1中id值与和表tab2中id值相同的行的val更新为tab2中val的值.select * from tab1; select * from tab2 最容易犯的错误是:update tab1 set val=(select val from tab2 where

MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)

有两张表,info1, info2 . info1: info2: 现在,要用info2中的数据更新info1中对应的学生信息,sql语句如下: UPDATE info1 t1 JOIN info2 t2 ON t1.name = t2.name SET t1.age = t2.age, t1.class = t2.class; 运行结果如下: 更新过的info1: 至于效率问题,之前我有三张表,都在40万左右.需要将 table2 中的两个字段(step1),table3 中的一个字段(ste

mysql从一个表提取数据更新另外一个表(修复表数据的不一致)

目前碰到一个数据不一致的情况,有两张表,一张项目表,一张项目成员表,项目表有个字段是项目工作时间,是项目成员的工作时间汇总.是由于该了逻辑,所以要把数据改成一致. 项目表的大致结构如下. 表名:project 项目成员表大致结构如下. 表名:projectMember projectMember表的PID和project的Id关联,project_WorkTime是member_WorkTime的和. 往project表插三条数据. projectMember表数据如下: sql语句如下: UP

Oracle用其中一个表的数据更新另一个表

update tab1 set val = (select val from tab2 where tab1.id = tab2.id) where exists (select 1 from tab2 where tab1.id = tab2.id) 这样tab2中没有的部分就不会被更新到tab1,但如果tab2中没值的部分,tab1中就应该为空,那就把最后一句去掉,改成 update tab1 set val = (select val from tab2 where tab1.id = t

Oracle中用一个表的数据更新另一个表的数据

update tbl1 a   set (a.col1, a.col2) = (select b.col1, b.col2                              from tbl2 b                              where a.key = b.key)   where a.key in(select key from tbl2)

mysql 两个关联表如何更新其中一个表的数据

今天遇到一个客户的数据更新问题,两个相关联的表,一个主表用于保存单据主要信息,一个副表用于保存单据的明细信息:现在要把主表的其中一个字段的数据更新到副表的一个字段中保存. 假设: A表是主表,有单号order_id.开单人operator.开单日期oper_date.备注memo等: B表是副表,有单号order_id.序号id.商品编码code.商品名称name.备注memo等. A表的备注是有数据的,B表的备注没有数据,现在要把A表的数据更新到B表,并且B表有数据的不能更新了.A表与B表是以

sqlserver 基于一张表更新另外一张表

SQL Server中如何基于一个表的数据更新另一个表的对应数据?实现的SQL语句有很多方式: 方式一 INNER JOIN UPDATE Table_A SET Table_A.col1 = Table_B.col1, Table_A.col2 = Table_B.col2 FROM Some_Table AS Table_A INNER JOIN Other_Table AS Table_B ON Table_A.id = Table_B.id WHERE Table_A.col3 = 'c

oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered

问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个pdm文件 2. 建表后预览sql 是有clustered 这个关键字的 3. 建表时报错 问题解决 调查发现数据库的问题,右键数据库属性 查看DBMS 发现是 SQL SERVER ! 解决办法就是切换DBMS: 点击确定 再次查看sql语句,一切正常.问题最终解决.

spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站

  1.spool命令 spool "D:\test.txt" spool off SQL> host cls 2.创建一个表 SQL> --条件(1):有创建表的权限,(2):有表空间 SQL> desc t4; 名称                                      是否为空? 类型 ----------------------------------------- -------- ------------------------