Oracle Database 23c新特性之关联更新和删除示例详解

 更新时间:2023年06月02日 14:36:28   作者:不剪发的Tony老师  
这篇文章主要介绍了Oracle Database 23c新特性之关联更新和删除的相关资料,Oracle database 23c开始支持在UPDATE和DELETE语句中使用JOIN连接,获取更新和删除的数据源,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下

Oracle database 23c 开始支持在 UPDATE 和 DELETE 语句中使用 JOIN 连接,获取更新和删除的数据源。

示例表

本文使用示例表可以通过 GitHub 下载,然后基于 employee 表创建一个 emp_devp:

CREATE TABLE emp_devp 
AS 
SELECT * FROM employee e 
WHERE dept_id = 4; 
UPDATE emp_devp 
SET salary = 0;
COMMIT;

emp_devp 中的 salary 字段全部设置为 0,用于验证关联更新。

关联更新

我们首先查看一下 emp_devp 中的数据:

SELECT emp_id, emp_name, salary, bonus, email
FROM emp_devp
ORDER BY emp_id;
emp_id|emp_name|salary|bonus  |email              |
------+--------+------+-------+-------------------+
     9|赵云     |  0.00|6000.00|zhaoyun@shuguo.com |
    10|廖化     |  0.00|       |liaohua@shuguo.com |
    11|关平     |  0.00|       |guanping@shuguo.com|
    12|赵氏     |  0.00|       |zhaoshi@shuguo.com |
    13|关兴     |  0.00|       |guanxing@shuguo.com|
    14|张苞     |  0.00|       |zhangbao@shuguo.com|
    15|赵统     |  0.00|       |zhaotong@shuguo.com|
    16|周仓     |  0.00|       |zhoucang@shuguo.com|
    17|马岱     |  0.00|       |madai@shuguo.com   |

然后我们通过 emp_id 字段关联 employee 表更新 emp_devp 中的数据,包括 salary、bonus 以及 email,数据来自 employee。

UPDATE emp_devp ed
SET ed.salary = e.salary,
    ed.bonus = e.bonus, 
    ed.email = e.email
FROM employee e 
WHERE e.emp_id = ed.emp_id;

Oracle 使用了 UPDATE FROM 语法实现关联更新,其他数据库可能使用 UPDATE JOIN 语法。

现在我们查看一下更新后的 emp_devp 数据:

SELECT emp_id, emp_name, salary, bonus, email
FROM emp_devp
ORDER BY emp_id;
emp_id|emp_name|salary  |bonus  |email              |
------+--------+--------+-------+-------------------+
     9|赵云     |15000.00|6000.00|zhaoyun@shuguo.com |
    10|廖化     | 6500.00|       |liaohua@shuguo.com |
    11|关平     | 6800.00|       |guanping@shuguo.com|
    12|赵氏     | 6600.00|       |zhaoshi@shuguo.com |
    13|关兴     | 7000.00|       |guanxing@shuguo.com|
    14|张苞     | 6500.00|       |zhangbao@shuguo.com|
    15|赵统     | 6000.00|       |zhaotong@shuguo.com|
    16|周仓     | 8000.00|       |zhoucang@shuguo.com|
    17|马岱     | 5800.00|       |madai@shuguo.com   |

在此之前的版本中,我们可以使用子查询或者 MERGE 语句实现相同的效果:

UPDATE emp_devp ed
SET (salary, bonus, email) = (SELECT salary, bonus, email
                              FROM employee e 
                              WHERE e.emp_id = ed.emp_id)
WHERE EXISTS (SELECT 1
              FROM employee e
              WHERE e.emp_id = ed.emp_id);
MERGE INTO emp_devp ed
USING employee e
ON (e.emp_id = ed.emp_id)
WHEN MATCHED THEN 
  UPDATE SET ed.salary = e.salary,
             ed.bonus = e.bonus,
             ed.email = e.email;

如果更新操作的数据源来自多个表,可以通过 JOIN 将它们进行连接。以下示例增加了 job 表作为数据更新的来源:

UPDATE emp_devp ed
SET ed.salary = e.salary,
    ed.bonus = e.bonus, 
    ed.email = e.email
FROM employee e 
JOIN job j ON (e.job_id = j.job_id AND j.job_title = '程序员')
WHERE e.emp_id = ed.emp_id;

以上语句只会更新 emp_devp 中职位名称为“程序员”的员工信息。

关联删除

我们同样可以基于 employee 中的数据删除 emp_devp 中的员工。以下示例使用 emp_id 作为两个表的关联字段,同时还增加了一个额外的过滤条件:

DELETE emp_devp ed
FROM employee e
WHERE ed.emp_id = e.emp_id
AND e.salary < 10000;

查看 emp_devp 中的数据:

SELECT emp_id, emp_name, salary, bonus, email
FROM emp_devp
ORDER BY emp_id;
EMP_ID|EMP_NAME|SALARY|BONUS|EMAIL             |
------+--------+------+-----+------------------+
     9|赵云     | 15000| 6000|zhaoyun@shuguo.com|

如果删除操作的数据源来自多个表,可以通过 JOIN 将它们进行连接。以下示例增加了 job 表作为数据删除的来源:

DELETE emp_devp ed
FROM employee e
JOIN job j ON j.job_id = e.job_id
WHERE ed.emp_id = e.emp_id
AND j.job_title = '开发经理';

到此这篇关于Oracle Database 23c新特性之关联更新和删除的文章就介绍到这了,更多相关Oracle Database 23c内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 直接拷贝数据文件实现Oracle数据迁移

    直接拷贝数据文件实现Oracle数据迁移

    Oracle 数据迁移是比较麻烦的,对菜鸟来说更是如此。最近由于更换服务器,需要将Oracle迁移到另外一台机器,在两个服务器环境相同,以及 Oracle版本相同的前提下,通过直接拷贝数据文件到新服务器,就可以直接迁移成功。这里记录一下迁移步骤。需要的朋友可以参考。
    2017-01-01
  • Oracle 如何创建和使用全文索引

    Oracle 如何创建和使用全文索引

    Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term)找出来,记录在一组 以dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息。
    2016-05-05
  • oracle 12c创建可插拔数据库(PDB)与用户详解

    oracle 12c创建可插拔数据库(PDB)与用户详解

    Oracle12c 中,增加了可插接数据库的概念,即PDB,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。下面这篇文章主要给大家介绍了利用oracle 12c创建可插拔数据库(PDB)与用户的相关资料,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • Oracle 10g client 安装图解教程

    Oracle 10g client 安装图解教程

    这篇文章主要介绍了Oracle 10g client 安装图解教程,需要的朋友可以参考下
    2017-03-03
  • Oracle数据库产重启服务和监听程序命令介绍

    Oracle数据库产重启服务和监听程序命令介绍

    大家好,本篇文章主要讲的是Oracle数据库产重启服务和监听程序命令介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Oracle三种循环(For、While、Loop)实现九九乘法表

    Oracle三种循环(For、While、Loop)实现九九乘法表

    这篇文章主要为大家详细介绍了Oracle三种循环For、While、Loop实现九九乘法表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 使用sqlplus连接Oracle数据库问题

    使用sqlplus连接Oracle数据库问题

    这篇文章主要介绍了使用sqlplus连接Oracle数据库问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Oracle 批处理自动备份bat脚本语句的步骤详解

    Oracle 批处理自动备份bat脚本语句的步骤详解

    这篇文章主要介绍了Oracle 批处理自动备份bat脚本语句的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • oracle中schema指的是什么意思

    oracle中schema指的是什么意思

    看来有的人还是对schema的真正含义不太理解,现在我再次整理了一下,需要的朋友参考下
    2017-03-03
  • oracle 11g的警告日志和监听日志的删除方法

    oracle 11g的警告日志和监听日志的删除方法

    这篇文章主要介绍了oracle 11g的警告日志和监听日志的删除方法,需要的朋友可以参考下
    2014-07-07

最新评论