阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle MERGE语句使用简述

200次阅读
没有评论

共计 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
  ON (M.EMPNO = N.EMPNO)
  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)
  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
  ON (M.EMPNO = N.EMPNO)
  WHEN MATCHED THEN
  5    UPDATE SET M.COMM = DEFAULT 
  6    DELETE WHERE M.EMPNO = N.EMPNO;
  
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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5191字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中