我是靠谱客的博主 刻苦嚓茶,最近开发中收集的这篇文章主要介绍MERGE用法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MERGE语句是Oracle9i新增的语法,用来合并UPDATEINSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERTUPDATE。其语法如下:

 

MERGE [hint] INTO [schema .] table [t_alias] USING [schema .]

{ table | view | subquery } [t_alias] ON ( condition )

WHEN MATCHED THEN merge_update_clause

WHEN NOT MATCHED THEN merge_insert_clause;

 

示例:

SQL> create table tab_emp as select empno, ename, deptno, sal from emp where 1 = 0;

Table created

SQL> select * from tab_emp;

EMPNO ENAME      DEPTNO       SAL

----- ---------- ------ ---------

SQL> merge into tab_emp a

  2  using emp b

  3  on(a.empno = b.empno)

  4  when matched then

  5      update

  6         set a.ename = b.ename,

  7             a.deptno = b.deptno,

  8             a.sal = b.sal

  9  when not matched then

 10      insert(empno, ename, deptno, sal)

 11      values(b.empno, b.ename, b.deptno, b.sal);

Done

SQL> commit;

Commit complete

SQL> select * from tab_emp;

EMPNO ENAME      DEPTNO       SAL

----- ---------- ------ ---------

 7369 SMITH          20    800.00

 7499 ALLEN          30   1600.00

 7521 WARD           30   1250.00

 7566 JONES          20   2975.00

 7654 MARTIN         30   1250.00

 7698 BLAKE          30   2850.00

 7782 CLARK          10   2450.00

 7788 SCOTT          20   3000.00

 7839 KING           10   5000.00

 7844 TURNER         30   1500.00

 7876 ADAMS          20   1100.00

 7900 JAMES          30    950.00

 7902 FORD           20   3000.00

 7934 MILLER         10   1300.00

14 rows selected

SQL> update emp set sal = 2000 where empno = '7499';

1 row updated

SQL> commit;

Commit complete

SQL>

SQL> merge into tab_emp a

  2  using emp b

  3  on(a.empno = b.empno)

  4  when matched then

  5      update

  6         set a.ename = b.ename,

  7             a.deptno = b.deptno,

  8             a.sal = b.sal

  9  when not matched then

 10      insert(empno, ename, deptno, sal)

 11      values(b.empno, b.ename, b.deptno, b.sal);

Done

SQL> commit;

Commit complete

SQL> select * from tab_emp;

EMPNO ENAME      DEPTNO       SAL

----- ---------- ------ ---------

 7369 SMITH          20    800.00

 7499 ALLEN          30   2000.00

 7521 WARD           30   1250.00

 7566 JONES          20   2975.00

 7654 MARTIN         30   1250.00

 7698 BLAKE          30   2850.00

 7782 CLARK          10   2450.00

 7788 SCOTT          20   3000.00

 7839 KING           10   5000.00

 7844 TURNER         30   1500.00

 7876 ADAMS          20   1100.00

 7900 JAMES          30    950.00

 7902 FORD           20   3000.00

 7934 MILLER         10   1300.00

14 rows selected

 

注:以上示例为merge语法中matched 和not matched clauses 同时使用,同时merge语法中也可以只插入不更新(即not mateched clause),也能只更新不插入(即matched then)。

 

在oracle10g也可用之delete语句,如下示例

SQL> merge into tab_emp a

  2  using emp b

  3  on (a.empno = b.empno)

  4  when MATCHED then

  5    update set a.ename = b.ename,

  6               a.deptno = b.deptno,

  7               a.sal = b.sal

  8    delete where (b.deptno != 20);

 

Done

 

SQL> commit;

 

Commit complete

 

SQL> select * from tab_emp;

 

EMPNO ENAME      DEPTNO       SAL

----- ---------- ------ ---------

 7369 SMITH          20    800.00

 7566 JONES          20   2975.00

 7788 SCOTT          20   3000.00

 7876 ADAMS          20   1100.00

 7902 FORD           20   3000.00

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20948385/viewspace-666456/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20948385/viewspace-666456/

最后

以上就是刻苦嚓茶为你收集整理的MERGE用法的全部内容,希望文章能够帮你解决MERGE用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部