《Oracle SQL疑难解析》——1.16 基于条件的插入或修改-阿里云开发者社区

开发者社区> 异步社区> 正文

《Oracle SQL疑难解析》——1.16 基于条件的插入或修改

简介:
+关注继续查看

本节书摘来自异步社区出版社《Oracle SQL疑难解析》一书中的第1章,第1.16节,作者: 【美】Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.16 基于条件的插入或修改

Oracle SQL疑难解析

1.16.1 要解决的问题

我们需要在表中插入一条记录,插入前根据KEY标识符判断。如果标识符不存在,则插入新记录;如果标识符已经存在,则根据语句中所给的新值对原记录中的字段进行更新。

1.16.2 解决方法

MERGE语句的功能是将新数据插入一个表中。记录是否存在,由主(PRIMARY)键进行判断。如果主键不存在于表中,则插入该行。如果主键匹配表中已有的行,则通过匹配键的其他详细信息更新该行。

在示例中,假设要把NEW_COUNTRIES 表中一些国家的信息添加到HR.COUNTIES表中:

merge into hr.countries c
using
 (select country_id, country_name
  from hr.new_countries) nc
on (c.country_id = nc.country_id)
when matched then
 update set c.country_name = nc.country_name
when not matched then
 insert (c.country_id, c.country_name)
 values (nc.country_id, nc.country_name);

1.16.3 数据库如何工作

如果直接把HR.NEW_COUNTRIES中的源数据插入HR.COUNTRIES目标表中,有可能会失败,由于HR.COUNTRIES表中可能已经有此国家的记录,因此造成主键值重复而插入失败。MERGE语句可以通过逻辑分支子句的ON来处理存在和不存在这两种情况。

通常,ON子句指定如何在源表和目标表之间匹配主键或唯一键。在本例句中,用COUNTRY_ID来匹配:

on (c.country_id = nc.country_id)

ON 子句后面跟着另两个子句,当键值相匹配时,执行“WHEN MATCHED CLAUSE”子句内容,当键值不匹配时,执行“WHEN NOT MATCHED”子句,会把新的记录插入目标表中。

match和not-match子句都可以包含更多的筛选条件,当满足删除条件时,也可以删除记录:

merge into hr.countries c
using
 (select country_id, country_name, region_id
  from hr.new_countries) nc
on (c.country_id = nc.country_id)
when matched then
 update set c.country_name = nc.country_name,
  c.region_id = nc.region_id
 delete where nc.region_id = 4
when not matched then
 insert (c.country_id, c.country_name, c.region_id)
 values (nc.country_id, nc.country_name, nc.region_id)
 where (nc.region_id != 4);

在这个修改后的版本中,除了REGION_ID的新值是4的行,其他根据COUNTRY_ID匹配的HR.CONTRIES的行都会修改COUNTR_NAME的值,而REGION_ID是4的行最终会删除。没有匹配上的行,除了REGION_ID的值是4的行,其他行都会被插入HR.COUNTRIES中,而REGION_ID的值是4的行会被忽略。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle XE http端口8080的修改
Oracle Express Edition(XE)默认的http端口是8080,这跟JBoss/Tomcat的默认端口相同,导致Jboss启动冲突。 修改办法: 1. 以dba身份登录XE 2.
840 0
【原】修改shm,oracle11g需要扩大共享内存
作者:david_zhang@sh 【转载时请以超链接形式标明文章】 链接:http://www.cnblogs.com/david-zhang-index/archive/2012/04/26/2472087.
831 0
【Mybatis】Mybatis generator自动生成插件如何修改Mapper.xml 的命名空间namespace
【Mybatis】Mybatis generator自动生成插件如何修改Mapper.xml 的命名空间namespace
6 0
dzq
E聊SDK在TypeScript下的条件编译(使用js-conditional-compile-loader插件)
使用js-conditional-compile-loader 实现对TypeScript 文件的条件编译
267 0
理解和使用Oracle分析工具LogMiner
用LogMiner             理解和使用Oracle   8i分析工具LogMiner                 Oracle   LogMiner   是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle   重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert、update、delete等)语句,另外还可分析得到一些必要的回滚SQL语句。
1177 0
【转】修改oracle的scn,很黄很暴力
文章转自:http://hi.baidu.com/asamchen/item/d9f527cd908b3c28a0b50ae5 今天接到一个很变态的要求,需要修改oracle的scn到非常非常大,找了点资料,尝试一下看看: 1.
1092 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载