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

2023-12-07 0 895
目录
  • 示例表
  • 关联更新
  • 关联删除

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 = \’开发经理\’;

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Oracle Oracle Database 23c新特性之关联更新和删除示例详解 https://www.u-9.cn/database/oracle/121949.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务