这两天给新同事安排了一个工作,即做一个update 的级联更新,在实际操作中发现了一个问题。就是对于oracle的更新的语法,大部分人尤其是学过SqlServer的人在使用oracle的时候对于oracle的更新会有许多的疑问。就此记下,以便日后查阅

update a set a.col1 = (select b.col1  from b  where b.col2 = a.col2)
 where exists
 (select * from b where a.col2 = b.col2)

/**oracle与sqlserver更新update的用法有不同,oracle是怎么处理的呢
update a set a.col1=100     将所有行全部的特定列col1更新为特定值
update a set a.col1=100 where a.col2<10 将满足col2条件的行的col1列的值更新为特定的值
update a set a.col1=a.col1+a.col2 where a.col2<10 同一个表中的简单计算更新
update a set a.col1=(select b.col1 from b where a.col2=b.col2)
where exists(select * from b where a.col2=b.col2) 级联更新,将满足a.col2=b.col2的行的a.col1更新为对应的
b.col1的值。当且仅当a=b时可以将where条件去掉。这个更新还可以这样理解:
update a set a.col1=(select b.col1 from b where a.col2=b.col2)表示对于a中所有行满足a.col2=b.col2
的进行更新,不满足条件的也更新,只不过找不到对应的值,只能将空值赋之,如果此时a.col1不允许为空那么会报插入空值错误。
所以只有加上where条件,才能将a.col2<>b.col2的那些在a中的数据得以幸存(不被更新为空)。

oracle的INSERT、UPDATE、MERGE

ORACLE 2009-12-21 08:40:55 阅读68 评论0   字号:大小 订阅

/*用COURSE表为模板,创建一张新表COURSE_NEW,并且包括COURSE表的所有记录 */

CREATE TABLE COURSE_NEW AS SELECT * FROM COURSE;

/*清空COURSE_NEW表中的所有记录*/
TRUNCATE TABLE COURSE_NEW;

/*往COURSE_NEW表中增加以下记录:
NO COURSE_NAME
A001 ORACLE数据库管理
A002 SQLSERVER安全指南
A003 Hibernate全攻略
A004 .NET
*/
INSERT INTO COURSE_NEW(NO,COURSE_NAME)
SELECT 'A001','ORACLE数据库管理' FROM DUAL
UNION
SELECT 'A002','SQLSERVER安全指南' FROM DUAL
UNION
SELECT 'A003','Hibernate全攻略'  FROM DUAL
UNION
SELECT 'A004','.NET' FROM DUAL;
COMMIT;

/*根据COURSE表中的NO字段,用COURSE_NEW更新COURSE表*/

UPDATE  (SELECT /*+ BYPASS_UJVC */ A.NO,A.COURSE_NAME,B.NO AS BNO,B.COURSE_NAME AS BNAME
               FROM COURSE A,COURSE_NEW B
               WHERE A.NO=B.NO)
SET NO=BNO,COURSE_NAME=BNAME
COMMIT;

/*分别使用INSERT/UPDATE和MERGE命令实现,用COURSE_NEW更新COURSE表中的记录,如果存在,则更新,不存在则INSERT*/
--用MERGE实现如下:

INSERT INTO COURSE_NEW(NO,COURSE_NAME) --为了便于操作,先在COURSE_NEW中插入一条记录
SELECT 'A005','HCNE网络工程师' FROM DUAL;
COMMIT;
MERGE INTO COURSE A
USING COURSE_NEW B ON(A.NO=B.NO)
WHEN MATCHED THEN
UPDATE SET A.COURSE_NAME=B.COURSE_NAME
WHEN NOT MATCHED THEN
INSERT(A.NO,A.COURSE_NAME)
VALUES(B.NO,B.COURSE_NAME);
COMMIT;

--用INSERT/UPDATE实现如下

INSERT INTO COURSE_NEW(NO,COURSE_NAME)--为了便于操作,再在COURSE_NEW中插入一条记录
SELECT 'A006','CCNA网络工程师' FROM DUAL;
COMMIT;

--利用UPDATE对于编号相同的字段进行更新
UPDATE COURSE A SET(NO,COURSE_NAME)=
       (SELECT B.NO,B.COURSE_NAME
       FROM COURSE_NEW B
       WHERE A.NO=B.NO )
WHERE  EXISTS
       (SELECT 1 FROM COURSE_NEW B
            WHERE A.NO=B.NO);
COMMIT;
--利用INSERT对于原表中没有的进行添加
INSERT INTO COURSE
SELECT * FROM COURSE_NEW A
        WHERE NOT EXISTS(SELECT 1 FROM COURSE B WHERE A.NO=B.NO);
COMMIT;

/*用一组语句代替对实现对全表的更新操作*/
--先用COURSE_TEST记录COURSE表的状态,以便在删除COURSE之后记录相关字段
CREATE TABLE COURSE_TEST AS SELECT * FROM   COURSE  WHERE ROWNUM<1;
INSERT /*+ APPEND */ INTO COURSE_TEST
SELECT * FROM COURSE WHERE ROWNUM<5;
COMMIT;
--删除COURSE表
TRUNCATE TABLE COURSE;
--更新COURSE表
INSERT /*+APPEND*/ INTO COURSE
SELECT A.NO,A.COURSE_NAME FROM COURSE_NEW A,COURSE_TEST B WHERE A.NO=B.NO;
COMMIT;

认识oracle的update更新相关推荐

  1. Oracle使用游标更新数据 Oracle游标之select for update和where current of 语句

    Oracle使用游标更新数据 2016年11月20日 13:15:49 hzwy23 阅读数:5313 友情推广 ###使用游标修改数据 ####定义一个游标,游标名称为 mycursor ##### ...

  2. oracle没有提交更新,oracle 中更新update不成功的原因

    oracle 中执行insert into 与delete 都正常,但是执行update 却没有反应. 原因: 是因为记录锁.这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在o ...

  3. oracle update更新语句

    注意:oracle中update多列用逗号分隔. 1.update IOP_T_USERINFO t set (t.birthday, t.department)=(select '5202','南京 ...

  4. oracle中nowait怎么用,oracle中UPDATE nowait 的使用方法介绍

    oracle中UPDATE nowait 的使用方法介绍 1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁 ...

  5. oracle回退的办法,【案例】Oracle for update回退导致业务阻塞的解决办法

    [案例]Oracle for update回退导致业务阻塞的解决办法 时间:2016-11-02 20:53   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Oracle研 ...

  6. oracle联表更新语句

    oracle联表更新语句,此处为什么要写下来呢,因为信誓旦旦地用sql中的语句去更新oracle,发现不通用,但是查询可以.所以特意写下来,以免忘记或提醒需要的你们~~ 第一种: update lqp ...

  7. oracle千万行update优化,Oracle的update优化

    Oracle的update语句优化研究 一. update语句的语法与原理 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值如:update t_join ...

  8. linux update更新源

    类似于windows的自动更新,linux也有相应的更新方式. 更新命令: $sudo apt-get update  #更新 $sudo apt-get upgrade  #升级,需要用update ...

  9. windows update更新时出现错误代码 8024200D解决方法(转)

    windows update更新时出现错误代码 8024200D解决方法(转) 参考文章: (1)windows update更新时出现错误代码 8024200D解决方法(转) (2)https:// ...

最新文章

  1. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
  2. centos图形界面和文本界面登陆切换设置
  3. 可视化卷及神经网络热力图
  4. 转载学习笔记:c++atoi
  5. python添加时间戳_在python中添加时间戳
  6. linux上修改html,linux进程名修改
  7. zip4j -- Java处理zip压缩文件
  8. 全国计算机二级c 笔记,[IT认证]全国计算机等级考试二级C语言笔记.doc
  9. 手绘流程图,教你WSL2与Docker容器无缝互相迁移
  10. 2014年西安区域赛的几道水题(A. F. K)
  11. 怎么用eclipse编写python_python用eclipse开发配置
  12. BZOJ.2555.SubString(后缀自动机 LCT)
  13. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·007【uni-app和vue.js基础快速上手】
  14. go语言和php哪个建站好,从0开始Go语言,用Golang搭建网站
  15. 用74LS161和74LS138加必要的门电路实现下面波形图的电路.
  16. ele组件JS弹框(确定或取消操作)
  17. UAC 管理员权限 程序 防止弹窗的四种解决办法
  18. 计算机考研和不考研的区别,考研和不考研有什么区别?问清楚自己考研动机
  19. 他一个人干掉了5个装甲军
  20. git clone 项目时总是提示输入密码

热门文章

  1. 月嫂的薪资为啥这么HIGH!
  2. 保护你的 Flutter 应用程序
  3. Gradle build.gradle配置
  4. 如何让微信丢骰子永远只出“666”
  5. 远程服务器返回错误: (500) 内部服务器错误解决办法
  6. vivado仿真出错
  7. CNN卷积神经网络结构遐思
  8. 一次日语翻译的Chrome插件开发经历
  9. HTML自学笔记-1(进入篇)
  10. 通过Fiddler进行抓包并分析