Oracle Merge 语法详解

Oracle Merge 语法详解

用过Hibernate的,大家对方法saveOrUpdate()一定都不陌生,它的意思是如果存在就update,如果不存在就insert。如果没有用Hibernate,那怎么实现? 常规方法就是我们自己去判断这个数据是insert还是update,但是如果每次都去查询一下决定insert/update,性能不一定很理想,尤其当数据超过千万,你需要频繁做这样的操作,性能一定很差。今天介绍Oracle自带的merge,就可以解决这个问题,性能比普通操作有2-3个数量级的提升。

语法:

Merge的来源表和目标表

merge

当不匹配的时候,就insert

merge_insert_clause

当匹配的时候,就update

merge_update_clause

匹配条件

where_clause

用merge, 从表的数据不能有重复的数据。

例子:

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

INSERT INTO bonuses(employee_id)
(SELECT e.employee_id FROM employees e, orders o
WHERE e.employee_id = o.sales_rep_id
GROUP BY e.employee_id);

SELECT * FROM bonuses ORDER BY employee_id;

EMPLOYEE_ID BONUS
———– ———-
153 100
154 100
155 100
156 100
158 100
159 100
160 100
161 100
163 100

MERGE INTO bonuses D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*.01)
WHERE (S.salary <= 8000);

SELECT * FROM bonuses ORDER BY employee_id;

EMPLOYEE_ID BONUS
———– ———-
153 180
154 175
155 170
159 180
160 175
161 170
179 620
173 610
165 680
166 640
164 720
172 730
167 620
171 740

[/sql]

希望遇到这种场景的,可以用merge帮大家解决问题。

发表评论

您的电子邮箱地址不会被公开。