我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle MERGE语句

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle MERGE语句

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle的merge语句怎么使用

Oracle的MERGE语句用于合并数据,可以同时执行INSERT、UPDATE、DELETE操作。它的基本语法如下:MERGE INTO target_table USING source_tableON (merge_conditi
oracle的merge语句怎么使用
2024-04-09

mysql merge语句的用法是什么

MySQL中没有MERGE语句,但是可以通过其他方式实现类似的功能。在MySQL中,可以使用INSERT INTO … ON DUPLICATE KEY UPDATE语句来实现类似于MERGE语句的功能。该语句的语法如下:INSERT
mysql merge语句的用法是什么
2024-04-09

mysql merge语句报错怎么解决

MySQL中没有MERGE语句,所以如果你尝试使用MERGE语句,会出现错误。如果你想要在MySQL中合并两个表的数据,可以使用INSERT INTO SELECT语句来实现。这个语句将会从一个表中选择数据并插入到另一个表中。以下是一个示
mysql merge语句报错怎么解决
2024-04-09

oracle常用SQL语句

+ ",(select LISTAGG(mo.model_code,",") within group(order by mo.model_code) from srm_pos_resource_model mo where mo.supplier_id=t.
oracle常用SQL语句
2014-10-15

oracle转mysql语句转换

场景:Oracle数据库 -> TD数据库(腾讯),而TD数据库实质上是对mysql数据库的封装拓展。因此,需要对项目中oracle的sql进行适配性转化,即在sql查询结果不变的前提下,转换成符合mysql语法的sql语句。 tips:其
2023-08-17

编程热搜

目录