返回顶部
首页 > 资讯 > 数据库 >Oracle MERGE语句
  • 311
分享到

Oracle MERGE语句

2024-04-02 19:04:59 311人浏览 八月长安
摘要

MERGE语句,它可以在一个sql语句中对一张表或一个视图同时做更新或插入操作,避免了多个INSERT、UPDATE和DELETE语句。它可以从一个或多个数据源中选择数据对目标表做更新或插入操作,你

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

您可能感兴趣的文档:

--结束END--

本文标题: Oracle MERGE语句

本文链接: https://lsjlt.com/news/51655.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Oracle MERGE语句
    MERGE语句,它可以在一个SQL语句中对一张表或一个视图同时做更新或插入操作,避免了多个INSERT、UPDATE和DELETE语句。它可以从一个或多个数据源中选择数据对目标表做更新或插入操作,你...
    99+
    2024-04-02
  • oracle的merge语句怎么使用
    Oracle的MERGE语句用于合并数据,可以同时执行INSERT、UPDATE、DELETE操作。它的基本语法如下: MERGE ...
    99+
    2024-04-09
    oracle
  • mysql如何实现类似于oracle的merge语句
    小编给大家分享一下mysql如何实现类似于oracle的merge语句,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 定期更新一个表A,但是表的数据来自于另一张表B。 A表和B表...
    99+
    2024-04-02
  • Oracle MERGE INTO语法探究
    1、MERGE INTO 的用途:   MERGE INTO 是Oracle 9i新增的语法,在10g时得到补充,用来合并UPDATE和INSERT语句,根据一张表或子查询与另一...
    99+
    2024-04-02
  • SQL Server中怎么使用Merge语句
    本篇文章给大家分享的是有关SQL Server中怎么使用Merge语句,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。面举一个例子来具体说明一下...
    99+
    2024-04-02
  • mysql merge语句的用法是什么
    MySQL中没有MERGE语句,但是可以通过其他方式实现类似的功能。 在MySQL中,可以使用INSERT INTO … ON DU...
    99+
    2024-04-09
    mysql
  • mysql merge语句报错怎么解决
    MySQL中没有MERGE语句,所以如果你尝试使用MERGE语句,会出现错误。 如果你想要在MySQL中合并两个表的数据,可以使用I...
    99+
    2024-04-09
    mysql
  • oracle SQL语句
    1.表空间 创建 create tablespace abc datafile ‘/u01/app/oracle/oradata/TestDB11/catalog.dbf’ 自定义数据文件位置及名...
    99+
    2024-04-02
  • Oracle的SQL语句
    无密码登录:sqlplus  / as sysdba查看当前的所有数据库:select name from v$database;查看当前数据库连接用户:show user查看当前用户所...
    99+
    2024-04-02
  • oracle 常用语句
    1.decode 函数(小版本的case when)select  decode(pd.discount_id,null,'','购买'||pd.product_count||'个,'|...
    99+
    2024-04-02
  • Oracle基础语句
    1、创建表create table IT_EMPLOYEES(ENPLOYEES_ID NUMBER(6) NOT NULL UNIQUE,FIRST_NAME VARCHAR2(20),LAST_...
    99+
    2024-04-02
  • Oracle必备语句
    Oracle_11g常用SQL语句(高级工程师必备)Oracle_11g常用SQL语句(高级工程师必备)  -- 退出 SQLPLUSexit;-- 修改 system(sys) 账号密...
    99+
    2024-04-02
  • Oracle merge 合并数据
    Oracle 9i引入的功能-- 按照 指定的条件执行插入或者更新操作 -- 如果满足条件的行存在 执行更新操作;否则执行插入操作--1避免多次重复执行插入和删除操作--2提高效率而且使用方便--3在数据仓...
    99+
    2024-04-02
  • oracle常用SQL语句
    + ",(select LISTAGG(mo.model_code,",") within group(order by mo.model_code) from srm_pos_resource_model mo wher ...
    99+
    2014-10-15
    oracle常用SQL语句
  • db基本语句(oracle)
    一. SQL分类DDL:数据定义语言(Data Definition Language)DML:数据操纵语言(Data Manipulation Language)TCL:事务控制语言(Transactio...
    99+
    2024-04-02
  • Oracle增加分区语句
    alter table table_name add     partition M201306 values less than ('20130701') &nbs...
    99+
    2024-04-02
  • ORACLE之sql语句优化
    今天是四月份最后一天的上班时间,明天就开始假期了!~三天!希望自己能利用这几天好好补一补专业知识,今天晚上开始学习SQL优化课程!常规优化1:尽量避免使用* 列出所有列,因为系统对*解析成列明会消耗一定时间...
    99+
    2024-04-02
  • oracle常用查询语句
    杀会话,必须要时刻背上来:select 'alter system kill session ''' || sid|| ',' || serial# || ''' immediate;' fro...
    99+
    2024-04-02
  • oracle dataguard常用sql语句
    select log_mode,open_mode ,database_role from v$database; --查看dataguard主备...
    99+
    2024-04-02
  • oracle语句使用经验
    SELECT FROM (SELECT A1. ,ROWNUM RNFROM (SELECT H.*FROM TBC_ADOWNBLK_HIST HWHERE 1 = 1OR...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作