认识oracle的update更新
这两天给新同事安排了一个工作,即做一个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更新的更多相关文章
- [转]Oracle存在则更新,不存在则插入
原文:http://hi.baidu.com/mawf2008/item/eec8c7ad1c5be5ae29ce9da6 merge into a using bon (a.a=b.b)when m ...
- Oracle的update语句优化研究
最近研究sql优化,以下文章转自互联网: 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation s ...
- 由于物化视图定义为on commit导致update更新基表慢的解决方案
由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...
- sql: oracle, for update和for update nowait的区别
1. oracle for update和for update nowait的区别 http://www.cnblogs.com/quanweiru/archive/2012/11/09/276222 ...
- [转]Oracle的update语句优化研究
原文地址:http://blog.csdn.net/u011721927/article/details/39228001 一. update语句的语法与原理 1. 语法 单表 ...
- oracle使用 merge 更新或插入数据
OracleCC++C# 总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...
- Oracle存在则更新,不存在则插入应用-merge
转: Oracle存在则更新,不存在则插入应用-merge 2017年01月11日 14:15:26 周星猩 阅读数 11354更多 分类专栏: Oracle 版权声明:本文为博主原创文章,遵循C ...
- 联表多字段update更新语句
前言 最近需要写联表多字段update更新语句,发现不同的数据库,SQL语法也不一样,正好我这里有MySQL.Oracle.PgSQL三种数据库环境,分别练习.实操这三种数据库的联表update语句 ...
- 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY
正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade 随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...
随机推荐
- Docker时间和宿主同步
通过date命令查看时间 查看主机时间 [root@localhost ~]# date 2016年 07月 27日 星期三 22:42:44 CST 查看容器时间 root@b43340ecf5ef ...
- python中单星号(*)和双星号(**)的使用
1.单星号*:对元组解包:接收可变参数 2.双星号**:对字典解包:接收可变参数 python函数的五类参数类型及出现顺序:必选参数.默认参数.可变参数.命名关键字参数.关键字参数 参考: https ...
- linux之getopt 函数(转)
命令行参数解析函数 —— getopt() getopt()函数声明如下: #include <unistd.h> int getopt(int argc, char * const ar ...
- 用shell查找某目录下的最大文件(转)
这是一个很有趣的问题,因为作为一个shell菜鸟,我第一时间是没有任何想法的.心里纳闷为什么这样的操作Linux居然没有直接的命令实现这样的查询. 很自然地,第一感觉就是用awk去实现,因为菜鸟我看a ...
- iOS 之UIBezierPath
代码地址如下:http://www.demodashi.com/demo/11602.html 在之前的文章中,由于用到过UIBezierPath这个类,所以这里就对这个类进行简单的记录一下,方便自己 ...
- iOS开发-重写description方法,自定义控制台(log)信息
description是所有类都有的一个方法. 我们重写这个方法,可以自定义实例输出的信息. 比如我们创建一个Person类: 在.h文件中添加两个属性: #import <Foundation ...
- Flume、Kafka、Storm结合
Todo: 对Flume的sink进行重构,调用kafka的消费生产者(producer)发送消息; 在Sotrm的spout中继承IRichSpout接口,调用kafka的消息消费者(Consume ...
- hibernate(jpa)中注解配置字段为主键
http://www.blogjava.net/ITdavid/archive/2009/02/25/256605.html 注解方式的主键配置 非自增字段为主键,注解annotation表示 ...
- 解决window10系统电脑插入耳机之后没有声音的问题
其实办法也是从百度百科上查到的 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 可能是因为自己某个不小心的操作更改了设置 1. 首先要点开设置按钮,在搜索栏输入控制面板 (当然知道控制面板在哪里的小伙伴就不用 ...
- 查看、修改linux系统的最大链接数限制、文件描述符限制、端口范围限制、虚拟内存等
一.修改最大连接数 1.查看当前文件描述符的限制数目的命令: ulimit -n 2.修改文件描述符的限制数目 2.1 临时改变当前会话: ulimit -n 65536 2.2 永久变更需要下面两个 ...