共计 5191 个字符,预计需要花费 13 分钟才能阅读完成。
MERGE 语句,它可以在一个 SQL 语句中对一张表或一个视图同时做更新或插入操作,避免了多个 INSERT、UPDATE 和 DELETE 语句。它可以从一个或多个数据源中选择数据对目标表做更新或插入操作,你可以指定在何种条件下更新或插入目标表或视图。不可以对同一行做多次更新操作。例如:实现用 B 表来更新 A 表数据,如果 A 表中没有,则把 B 表的数据插入 A 表。
Oracle 11gR2 语法如下:
MERGE [hint]
INTO [schema.] {table | view} [t_alias]
USING {[ schema.] {table | view}
| subquery
} [t_alias]
ON (condition)
[merge_update_clause]
[merge_insert_clause]
[error_logging_clause] ;
#merge_update_clause
WHEN MATCHED THEN
UPDATE SET column = {
expr
| DEFAULT }
[, column = {
expr
| DEFAULT } ]...
[where_clause]
[DELETE where_clause]
#merge_insert_clause
WHEN NOT MATCHED THEN
INSERT [(column [, column]...) ]
VALUES ({
expr
| DEFAULT }
[, {
expr
| DEFAULT } ]...
)
[where_clause]
#error_logging_clause
LOG ERRORS
[INTO [schema.] table ]
[(simple_expression) ]
[REJECT LIMIT { integer | UNLIMITED} ]
使用例子说明 MERGE 语句的作用:
创建测试表 emp_m
scott@TEST>
create
table
emp_m
as
select
*
from
emp
where
comm
is
not
null
;
Table
created.
scott@TEST>
select
*
from
emp_m;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
例子 1:插入和更新操作
现在测试表 emp_m 中只有 comm 不为空的数据,现在要把在 emp 表而不在 emp_m 表中的数据插入到 emp_m 表中,并把 emp_m 表中现有的数据的 comm 增加 10。
scott@TEST>MERGE
INTO
EMP_M M
2 USING EMP N
3
ON
(M.EMPNO = N.EMPNO)
4
WHEN
NOT
MATCHED
THEN
5
INSERT
6 (M.EMPNO, M.ENAME, M.JOB, M.MGR, M.HIREDATE, M.SAL, M.COMM, M.DEPTNO)
7
VALUES
8 (N.EMPNO, N.ENAME, N.JOB, N.MGR, N.HIREDATE, N.SAL, N.COMM, N.DEPTNO)
9
WHEN
MATCHED
THEN
10
UPDATE
SET
M.COMM = M.COMM + 10;
14
rows
merged.
scott@TEST>
select
*
from
emp_m;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 310 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 510 30
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1410 30
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 10 30
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
14
rows
selected.
例子 2:实现删除操作
从 emp_m 表中删除表 emp 中 DEPTNO=30 的记录。
scott@TEST>MERGE
INTO
EMP_M M
2 USING (
SELECT
EMPNO
FROM
EMP
WHERE
DEPTNO = 30) N
3
ON
(M.EMPNO = N.EMPNO)
4
WHEN
MATCHED
THEN
5
UPDATE
SET
M.COMM =
DEFAULT
6
DELETE
WHERE
M.EMPNO = N.EMPNO;
6
rows
merged.
scott@TEST>
select
*
from
emp_m;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
使用注意事项:
- 不能指定一个在它上面定义了 INSTEAD OF 触发器的视图为目标视图。
- USING 子名指定源数据,可以是表、视图或子查询
- UPDATE 子句中的 where 条件可以指定目标表的条件也可以指定源表的条件
- UPDATE 子句中不能更新 ON 条件中的列,更新表时不能指定 DEFAULT
- UPDATE 子句中指定 DELETE WHERE 用于删除数据。
- INSERT 子句中,如果 INSERT 后省略列名,VALUES 后的列的个数必须与目标表列个数一致
- INSERT 子句中,可以使用 WHERE 条件限制插入的数据
官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-05/143563.htm
正文完
星哥玩云-微信公众号