Oracle 中的 Merge 语句

本文通过具体的数据库操作演示了如何使用SQL的MERGE语句来更新或插入记录。首先创建并填充了两个表:employee和bonuses,然后利用MERGE语句根据部门编号为20的员工信息进行更新或插入奖金信息。
Merge Statement DemoMERGE <hint> INTO <table_name>
USING <table_view_or_query>
ON (<condition>)
WHEN MATCHED THEN <update_clause>
DELETE <where_clause>
WHEN NOT MATCHED THEN <insert_clause>
[LOG ERRORS <log_errors_clause> <reject limit <integer | unlimited>];
CREATE TABLE employee (
employee_id NUMBER(5),
first_name  VARCHAR2(20),
last_name   VARCHAR2(20),
dept_no     NUMBER(2),
salary      NUMBER(10));

INSERT INTO employee VALUES (1, 'Dan', 'Morgan', 10, 100000);
INSERT INTO employee VALUES (2, 'Jack', 'Cline', 20, 100000);
INSERT INTO employee VALUES (3, 'Helen', 'Lofstrom', 20, 50000);
INSERT INTO employee VALUES (4, 'Jackie', 'Stough', 20, 40000);
INSERT INTO employee VALUES (5, 'Richard', 'Foote', 20, 70000);
INSERT INTO employee VALUES (6, 'Joe', 'Johnson', 20, 30000);
INSERT INTO employee VALUES (7, 'Clark', 'Urling', 20, 90000);

CREATE TABLE bonuses (
employee_id NUMBER, bonus NUMBER DEFAULT 100);

INSERT INTO bonuses (employee_id) VALUES (1);
INSERT INTO bonuses (employee_id) VALUES (2);
INSERT INTO bonuses (employee_id) VALUES (4);
INSERT INTO bonuses (employee_id) VALUES (6);
INSERT INTO bonuses (employee_id) VALUES (7);
COMMIT;

SELECT * FROM employee;

SELECT * FROM bonuses;

MERGE INTO bonuses b
USING (
  SELECT employee_id, salary, dept_no
  FROM employee
  WHERE dept_no =20) e
ON (b.employee_id = e.employee_id)
WHEN MATCHED THEN
  UPDATE SET b.bonus = e.salary * 0.1
  DELETE WHERE (e.salary < 40000)
WHEN NOT MATCHED THEN
  INSERT (b.employee_id, b.bonus)
  VALUES (e.employee_id, e.salary * 0.05)
  WHERE (e.salary > 40000);

SELECT * FROM bonuses;
### 使用方法 MERGE 语句的基本语法如下: ```sql MERGE INTO 表名 USING 表名/视图/子查询 ON 连接条件 -- 当匹配得上连接条件时 WHEN MATCHED THEN 更新、删除操作 -- 当匹配不上连接条件时 WHEN NOT MATCHED THEN 更新、删除、插入操作; ``` 此语法通过将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行 UPDATE,无法匹配时对目标表执行 INSERT 等操作 [^3][^4]。 ### 功能 MERGE 语句结合了 INSERT、UPDATE 和 DELETE 操作的功能,通常被称为“upsert”操作(update + insert)。当需要对一个表根据不同条件分别进行 INSERT、UPDATE 以及 DELETE 操作时,可以使用该语句。它能根据不同条件获取要插入、更新或删除到表中的数据行,然后从 1 个或多个数据源头对表进行更新或者向表中插入行,避免多次执行不同操作 [^1][^2][^4]。 ### 示例 假设有两个表:`target_table`(目标表)和 `source_table`(源表),它们都有 `id` 和 `value` 两列。 创建表的 SQL 语句如下: ```sql -- 创建目标表 CREATE TABLE target_table ( id NUMBER PRIMARY KEY, value VARCHAR2(100) ); -- 创建源表 CREATE TABLE source_table ( id NUMBER PRIMARY KEY, value VARCHAR2(100) ); ``` 插入示例数据: ```sql -- 向目标表插入数据 INSERT INTO target_table (id, value) VALUES (1, 'Old Value 1'); INSERT INTO target_table (id, value) VALUES (2, 'Old Value 2'); -- 向源表插入数据 INSERT INTO source_table (id, value) VALUES (1, 'New Value 1'); INSERT INTO source_table (id, value) VALUES (3, 'New Value 3'); ``` 使用 MERGE 语句进行数据合并: ```sql MERGE INTO target_table t USING source_table s ON (t.id = s.id) WHEN MATCHED THEN UPDATE SET t.value = s.value WHEN NOT MATCHED THEN INSERT (id, value) VALUES (s.id, s.value); ``` 在上述示例中,当 `target_table` 和 `source_table` 的 `id` 匹配时,会更新 `target_table` 中的 `value` 值;当 `id` 不匹配时,会将 `source_table` 中的数据插入到 `target_table` 中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值