《Oracle SQL疑难解析》——1.16 基于条件的插入或修改
本节书摘来自异步社区出版社《Oracle SQL疑难解析》一书中的第1章,第1.16节,作者: 【美】Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以访问云栖社区“异步社区”公众号查看。
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的行会被忽略。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
- 【Oracle】并行等待之PX Deq: Table Q Normal
- YII2+oracle,php5.x升级到php7.2.x以上,sql报错:General error: 904 OCIStmtExecute: ORA-00904: "xxxx": invalid identifier
- ORACLE SQL调优案例一则
- oracle 常用SQL
- ORACLE关于锁表查询的部分SQL
- Oracle初级索引学习总结
- 【学习总结】SQL的学习-2-sql操作
- MySQL使用SQL实现Oracle Rank函数功能
- PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT
- oracle与sql server大批量存储过程可以替换部分
- oracle 判断某个表是否存在
- SQL Server vs Oracle 简单语法比较
- Oracle数据库表结构导出
- [转] Oracle数据库维护常用SQL语句集合
- PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT
- oracle与sql server大批量存储过程可以替换部分
- Atitit if else 选择决策流程ast对比 sql java 表达式类型 binaryExpression hase left and rit expr 目录 1.1. Sql1
- C# Oracle、Sql Server连接(增、删、改、查)
- oracle删除日志文件
- db2,oracle,mysql ,sqlserver限制返回的行数
- 基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现
- 【Oracle】通过LogMiner实现Oracle数据同步迁移
- Oracle SQL是关于集合的
- Oracle进程
- How to Enable Oracle Enterprise Manager Express 19c
- Oracle的学习心得和知识总结(十九)|Oracle数据库Real Application Testing之SQL Performance Analyzer实操(二)