时间:2023-10-31来源:系统城装机大师作者:佚名
Oracle database 23c 开始支持在 UPDATE 和 DELETE 语句中使用 JOIN 连接,获取更新和删除的数据源。
本文使用示例表可以通过 GitHub 下载,然后基于 employee 表创建一个 emp_devp:
1 2 3 4 5 6 7 |
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 中的数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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。
1 2 3 4 5 6 |
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 数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 语句实现相同的效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 表作为数据更新的来源:
1 2 3 4 5 6 7 |
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 作为两个表的关联字段,同时还增加了一个额外的过滤条件:
1 2 3 4 |
DELETE emp_devp ed FROM employee e WHERE ed.emp_id = e.emp_id AND e.salary < 10000; |
查看 emp_devp 中的数据:
1 2 3 4 5 6 |
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 表作为数据删除的来源:
1 2 3 4 5 |
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新特性之关联更新和删除的文章就介绍到这了
2023-10-31
Oracle如何编写一个sqlldr实例2023-10-31
Oracle的SQLLDR用法简介2023-10-31
Oracle中的高效SQL编写PARALLEL解析1.Oracle数据库系统结构概述 2.Oracle数据库存储结构 物理存储结构 控制文件 数据文件 重做日志文件 归档日志文件 Oracle数据库逻辑结构 数据块(Data Block) (盘)区(Extent) 段(Segment) 表空间(Tablespace) 本地管...
2023-10-31
windows下的Oracle19c 一、官网下载Oracle19c数据库 二、安装Oracle数据库 1.解压安装包 2.运行setup.exe安装 三、配置 四、安装完Oracle数据库,给scott用户解锁 1.解决Oracle数据库中没有scott账户的问题 2.给scott...
2023-10-31