分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报

有下面两个表:将表tab1中id值与和表tab2中id值相同的行的val更新为tab2中val的值.
select * from tab1;

select * from tab2

最容易犯的错误是:update tab1 set val=(select val from tab2 where tab1.id=tab2.id);
更新完后的结果是:select * from tab1,在tab1中有的行,如果在tab2中没有对应的行,值被更新为null

改正为: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中一条的情况也会出错.
最好的方法是用merge语法:

  1. merge into tab1
  2. using tab2
  3. on(tab1.id=tab2.id)
  4. when matched then
  5. update set tab1.val = tab2.val

同样,如果tab2中有多条对应tab1中一条的情况也会出错:ORA-30926: unable to get a stable set of rows in the source tables
比如在tab2中再插入一条 insert into tab2 values(2,'xxxx')
可以通过在using中的subquery中将重复记录过滤来避免这种错误,merge终极版:

  1. merge into tab1
  2. using  (select * FROM tab2 X  WHERE  X.ROWID =
  3. (SELECT MAX(Y.ROWID) FROM  tab2 Y  WHERE  X.ID = Y.ID)) tab2
  4. on(tab1.id=tab2.id)
  5. when matched then
  6. update set tab1.val = tab2.val

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

    准备阶段 1.建表语句: create table table1( idd varchar2(10) , val varchar2(20) ); create table table2( idd va ...

  2. Oracle SQL——如何用一个表的数据更新另一个表中的数据

    背景 一次处理数据的过程中,需要将表A(源表)的数据更新到表B(目标表)中 前提 两张表一定要有关联字段 使用关联字段联查两张表时,两张表关系必须满足条件:目标表和源表的表间关系一定是多对一或者一对一 ...

  3. 【转载】SQL语句用一个表的数据更新另一个表

    在Sqlserver的维护更新操作中,有时候涉及到Update操作,其中有一种情况是根据特定的条件,以一个表中的数据更新另一个表的数据,此时涉及到两个表之间的关系以及操作,此处介绍2种更新方法. (1 ...

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

    目前碰到一个数据不一致的情况,有两张表,一张项目表,一张项目成员表,项目表有个字段是项目工作时间,是项目成员的工作时间汇总.是由于该了逻辑,所以要把数据改成一致. 项目表的大致结构如下. 表名:pro ...

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

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

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

    有两张表,info1, info2 . info1: info2: 现在,要用info2中的数据更新info1中对应的学生信息,sql语句如下: UPDATE info1 t1 JOIN info2 ...

  7. Oracle中用随机数更新字段----将一张表的数据插入另一张表----环境设置

    DECLARE CURSOR recordCursor IS SELECT longitude,latitude FROM WR_WIUST_B_SEC FOR UPDATE; recordRow r ...

  8. sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新

    将源TXT文件sourceFile_table.txt导入数据库,生成新表dbo.sourceFile_table.新增字段lon.lat.shi.xian 源表dbo.sourceFile_tabl ...

  9. SQL Server 用一张表的数据更新另一张表的数据(转载)

    文章一:SQL Server中如何基于一个表的数据更新另一个表的对应数据的SQL语句脚本 https://codedefault.com/2017/sql-server-update-from-a-s ...

随机推荐

  1. An Overview of Complex Event Processing2

    An Overview of Complex Event Processing 翻译前言:感觉作者有点夸夸其谈兼絮絮叨叨,但文章还是很有用的.原文<An Overview of Complex ...

  2. Android中Dialog的使用

    上一篇博文讲到对话框popWindow的使用,这篇博文主要解说Dialog的使用. 1.什么是Dialog? Dialog就是对话框的一种方式! 在Android开发中.我们常常会须要在Android ...

  3. PHP_保留两位小数而且四舍五入_保留两位小数而且不四舍五入

    php保留两位小数而且四舍五入 $num = 123213.666666; echo sprintf("%.2f", $num); php保留两位小数而且不四舍五入 $num =  ...

  4. 华为-on练习--小写字符数的统计显示

    主题: 手动输入一个字符串,只有小写字母,统计每个字符和输出频率中出现的串,输出.提示可以使用map 样例:输入:aaabbbccc 输出:a 3 b 3 c 3 分析: 看到后面的提示,简直就是不用 ...

  5. javascript和css浏览器兼容性总结

    一些浏览器的兼容性做一个总结的问题以下: 为什么会出现这样的现象是?主要表现为Firefox这样的良好支持的浏览器W3C标准,这是现在CSS支持最好的浏览器,和ie它比较早出现,在w3c支持一直没有做 ...

  6. 阅读:AirBag Boosting Smartphone Resistance to Malware Infection

  7. tshark命令行的使用(转)

    tshark是wireshark的一个命令行工具用于抓包分析: 主要参数如下: 1. 抓包接口类 -i 设置抓包的网络接口,不设置则默认为第一个非自环接口. -D 列出当前存在的网络接口.在不了解OS ...

  8. DiskFileUpload类别

    1.2.2 DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发者通过这个类来与Apache文件上传组件进行交互.以下介绍DiskFileUp ...

  9. [Eclipse]代码已被写入关于如何切换到unix在新行

    切换换行符的显示格式, 一般的设置是这种: 可是这样仅仅能对新文件起作用,原来已经写好的还是那熊样.(怎么办呢,得吃懊悔药啊,谁让你開始没准备好呢?!T_T) 以下就是懊悔药: 这样就OK了. 附:有 ...

  10. 《编程简介(Java) &#183;10.3递归思想》

    <编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...