这两天给新同事安排了一个工作,即做一个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存在则更新,不存在则插入

    原文:http://hi.baidu.com/mawf2008/item/eec8c7ad1c5be5ae29ce9da6 merge into a using bon (a.a=b.b)when m ...

  2. Oracle的update语句优化研究

    最近研究sql优化,以下文章转自互联网: 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation s ...

  3. 由于物化视图定义为on commit导致update更新基表慢的解决方案

    由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...

  4. sql: oracle, for update和for update nowait的区别

    1. oracle for update和for update nowait的区别 http://www.cnblogs.com/quanweiru/archive/2012/11/09/276222 ...

  5. [转]Oracle的update语句优化研究

    原文地址:http://blog.csdn.net/u011721927/article/details/39228001 一.         update语句的语法与原理 1.     语法 单表 ...

  6. oracle使用 merge 更新或插入数据

    OracleCC++C#  总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...

  7. Oracle存在则更新,不存在则插入应用-merge

    转: Oracle存在则更新,不存在则插入应用-merge 2017年01月11日 14:15:26 周星猩 阅读数 11354更多 分类专栏: Oracle   版权声明:本文为博主原创文章,遵循C ...

  8. 联表多字段update更新语句

    前言 最近需要写联表多字段update更新语句,发现不同的数据库,SQL语法也不一样,正好我这里有MySQL.Oracle.PgSQL三种数据库环境,分别练习.实操这三种数据库的联表update语句 ...

  9. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

随机推荐

  1. $apply用法注意

    Angular为我们提供了一些接口绑定JavaScript代码和数据,而绑定数据改变和更新angular则是使用$apply方法实现的. $apply 进行数据变化检查的实际上是$digest函数,但 ...

  2. Mysql5.6.x版本半同步主从复制的开启方法

    介绍 先了解一下mysql的主从复制是什么回事,我们都知道,mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制. 主库实际上并不关心从库是否把数据拉完没有, ...

  3. 项目笔记:导出Excel功能

    1.前台这块: var ids=""; $.post("${basePath}/assets/unRegDeviceAction_getDeviceIds.do" ...

  4. c3p0配置详解<转贴>

    <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> < ...

  5. [转载]Oracle批量执行

    FROM: http://www.cnblogs.com/wangyayun/p/4514411.html //批量添加20000条数据用时8秒. try { String url = "j ...

  6. EffectiveJava(22)JAVA四种嵌套类的特点及用法

    嵌套类: 1.静态成员类 静态成员类是外围类的一个静态成员,遵守同样的可访问性规则 用法:a.作为公有的辅助类 内部类: 2.非静态成员类 语法上只和静态成员类的唯一区别是少一个static修饰符 a ...

  7. Unity3D研究院之IOS本地消息通知LocalNotification的使用(六十七)

    http://www.xuanyusong.com/archives/2632    现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送 ...

  8. centos7,py2和py3共存

    1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用 python -V 命令查看一下是否安 ...

  9. 在OpenErp的配置文件中为数据库密码加密

      openerp连接数据库的用户名和密码可以命令行给出, 也可以设置在配置文件中, 如下例所示: db_user = openerp db_password = laoliu 因为它使用了明文的密码 ...

  10. 转: Your build settings specify a provisioning profile with the UUID, no provisioning profile was found

    http://blog.csdn.net/rbyyyblog/article/details/12220875 在Archive项目时,出现了“Your build settings specify ...