《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的行会被忽略。

相关文章
|
12月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
932 3
|
SQL 安全 关系型数据库
SQL注入之万能密码:原理、实践与防御全解析
本文深入解析了“万能密码”攻击的运行机制及其危险性,通过实例展示了SQL注入的基本原理与变种形式。文章还提供了企业级防御方案,包括参数化查询、输入验证、权限控制及WAF规则配置等深度防御策略。同时,探讨了二阶注入和布尔盲注等新型攻击方式,并给出开发者自查清单。最后强调安全防护需持续改进,无绝对安全,建议使用成熟ORM框架并定期审计。技术内容仅供学习参考,严禁非法用途。
2214 0
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
721 8
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
773 6
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
5195 11
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。

推荐镜像

更多