Oracle数据库MERGE语句用法

一、使用背景 

    当需要对一个表根据不同条件分别进行INSERT、UPDATE以及DELETE操作时,可以使用MERGE(融合,合并)语句。MERGE语句可以根据不同条件获取要插入、更新或删除到表中的数据行,然后从1个或多个数据源头对表进行更新或者向表中插入行。(我需要将一张表的数据更新到另一张表中)

二、MERGE语句的语法


MERGE INTO 表名
USING 表名/视图/子查询 ON 连接条件
-- 当匹配得上连接条件时
WHEN MATCHED THEN 
更新、删除操作
-- 当匹配不上连接条件时
WHEN NOT MATCHED THEN 
更新、删除、插入操作

使用条件:

USING:简化的连接查询

使用条件:1、查询条件必须是等值连接

                 2、等值连接列必须有相同的名称和数据类型

三、示例

1、创建要操作的表,并插入几条数据

-- 60号部门员工奖金表
CREATE TABLE dept60_bonuses
(
   employee_id NUMBER,
   bonus_amt NUMBER
);
 
INSERT INTO dept60_bonuses
VALUES
(103, 0);
INSERT INTO dept60_bonuses
VALUES
(104, 100);
INSERT INTO dept60_bonuses
VALUES
(105, 0);
 
-- 提交事务
COMMIT;
 
SELECT employee_id, last_name, salary
FROM hr.employees

2、根据不同条件对dept60_bonuses记录进行新增、修改以及删除操作(操作示意图)

MERGE INTO dept60_bonuses b
USING (
           SELECT employee_id, salary, department_id
           FROM hr.employees
           WHERE department_id = 60
      ) e
ON (b.employee_id = e.employee_id)
-- 当符合关联条件时
WHEN MATCHED THEN
     -- 将奖金为0的员工的奖金调整为其工资的20%
     UPDATE 
     SET b.bonus_amt = e.salary * 0.2
     WHERE b.bonus_amt = 0
     -- 删除工资大于7500的员工奖金记录
     DELETE 
     WHERE (e.salary > 7500)
-- 当不符合连接条件时
WHEN NOT MATCHED THEN
     -- 将不在部门为60号的,且不在dept60_bonuses表的用工信息插入,并将其奖金设置为其工资的10%
     INSERT 
     (b.employee_id, b.bonus_amt)
     VALUES 
     (e.employee_id, e.salary * 0.1)
     WHERE (e.salary < 7500)

3、操作结果

4、MERGE语句完成了以下任务:

· 更新了一行(员工id=105)

· 删除了一行(员工id=103)

· 插入了两行(员工id=106 & 107)
————————————————
版权声明:本文为CSDN博主「周末未至」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zorro_jin/article/details/81053693

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`MERGE INTO` 是 Oracle 数据库中的一种语法,用于将一个表中的数据合并到另一个表中。它可以根据某些条件来判断是执行插入操作还是更新操作。 `MERGE INTO` 语句的基本语法如下: ``` MERGE INTO table1 USING table2 ON (condition) WHEN MATCHED THEN UPDATE SET column1 = value1, column2 = value2,... WHEN NOT MATCHED THEN INSERT (column1, column2,...) VALUES (value1, value2,...); ``` 其中,`table1` 是要被更新或插入数据的目标表,`table2` 是要合并到目标表的源表,`condition` 是用于匹配目标表和源表记录的条件。 当匹配成功时,`UPDATE` 子句将更新目标表中的记录。`WHEN NOT MATCHED` 子句将在目标表中没有匹配记录时执行插入操作。 以下是一个简单的例子,假设有两个表 `employees` 和 `employee_updates`,需要将 `employee_updates` 中的数据合并到 `employees` 表中: ``` MERGE INTO employees e USING employee_updates eu ON (e.employee_id = eu.employee_id) WHEN MATCHED THEN UPDATE SET e.salary = eu.salary WHEN NOT MATCHED THEN INSERT (e.employee_id, e.first_name, e.last_name, e.salary) VALUES (eu.employee_id, eu.first_name, eu.last_name, eu.salary); ``` 以上语句将根据 `employee_id` 来匹配 `employees` 表和 `employee_updates` 表的记录,如果匹配成功,则将 `employees` 表中相应记录的 `salary` 字段更新为 `employee_updates` 表中相应记录的 `salary` 字段。如果匹配不成功,则将 `employee_updates` 表中的记录插入到 `employees` 表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值