Oracle MERGE语句
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,MERGE语句,它可以在一个SQL语句中对一张表或一个视图同时做更新或插入操作,避免了多个INSERT、UPDATE和DELETE语句。它可以从一个或多个数据源中选择数据对目标表做更新或插入操作,你可
千家信息网最后更新 2025年01月23日Oracle MERGE语句
MERGE语句,它可以在一个SQL语句中对一张表或一个视图同时做更新或插入操作,避免了多个INSERT、UPDATE和DELETE语句。它可以从一个或多个数据源中选择数据对目标表做更新或插入操作,你可以指定在何种条件下更新或插入目标表或视图。不可以对同一行做多次更新操作。例如:实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表。
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 THENUPDATE SET column = { expr | DEFAULT } [, column = { expr | DEFAULT } ]...[ where_clause ][ DELETE where_clause ]#merge_insert_clauseWHEN NOT MATCHED THENINSERT [ (column [, column ]...) ]VALUES ({ expr | DEFAULT } [, { expr | DEFAULT } ]... )[ where_clause ]#error_logging_clauseLOG 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 1014 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
数据
更新
条件
子句
目标
视图
语句
例子
个数
多个
测试
一致
一行
中指
事项
作用
只有
同时
官方
数据源
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中关系表是什么
哪个证券公司诚信档案数据库
长沙哪学校学软件开发怎么样
世界网络安全大赛ctf冠军
江西网络营销软件开发定制排行榜
mysql数据库数据导出
描述两种数据库技术的区别
数据库删除相同属性
如何设置两个字段为数据库主键
普洱龚明网络安全支队长
深圳mes软件开发
网络安全论文结语
服务器是一种
苹果6数据库开不了怎么办
软件开发规章制度
肆悦软件开发有限公司
广电e家亲 建立服务器
ios http 服务器
lol英雄详细数据库
服务器ocp架构
软件开发怎么评中级
远程服务器安全管理办法
网络安全的调研方法
日本工作软件开发
数据库简称列名
数据库的安全性主要是保证
荧光pcr分析软件开发
软件开发过程时需确认过程吗
网络安全专业考研知识
h3c服务器的安全面板是什么