这两天给新同事安排了一个工作,即做一个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. Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目

    Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...

  2. kvm : Permission denied

    创建虚拟机类型为:“virt type :kvm” 时,会报如下错误: Could not access KVM kernel module: Permission denied failed to ...

  3. centos7服务器基本的安全设置

    在使用云服务器的过程中经常会遇到很多非法的入侵试图登录服务器,所以我们需要对服务器进行安全防范 关闭ping扫描,虽然没什么卵用 先切换到root echo 1 > /proc/sys/net/ ...

  4. unity render pipeline

    post process v2 GUI temp8->TaregtPool0->temp8       tem8                      temp8->backbu ...

  5. Hadoop之Sqoop详解

    sqoop数据迁移1.简介 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.HBA ...

  6. 【MySQL】海量量数据查询优化

    参考资料: mysql处理海量数据时的一些优化查询速度方法:http://www.cnblogs.com/lingiu/p/3414134.html mysql千万级大数据SQL查询优化:http:/ ...

  7. Jfinal极速开发微信系列教程(三)--------------对JSP的支持以及部署Tomcat运行异常问题

    本文章主要解决以下问题: 1.Jfianl对JSP的支持2.Jfianl Maven项目部署到Tomcat,启动项目异常问题解决 第一个问题重现截图解决方案:1.在configConstant中添加视 ...

  8. JavaScript完整性检查

    1.7个“坑” <!DOCTYPE html> <html lang="zh"> <head> <meta charset="U ...

  9. 【Dos】Dos命令大全

    dos命令大全 AT 计划在计算机上运行的命令和程序.ATTRIB 显示或更改文件属性.BREAK 设置或清除扩展式 CTRL+C 检查.CACLS 显示或修改文件的访问控制列表(ACLs).CALL ...

  10. jquery ui dialog 中使用select2 导致select2的input失去焦点的解决方法

    在jqueryUI 的dialog中使用select2,select2的input search无论怎样都获取不到焦点? 解决方法: $(document).ready(function () { $ ...