Oracle9i之后的MERGE语法

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

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

 

MERGE  INTO  table_name  AS  table_alias
USING (
table | view | sub_query)  AS  alias
ON  ( join  condition)
WHEN  MATCHED  THEN
UPDATE   SET
col1 
=  col_val1,
col2 
=  col2_val
WHEN   NOT  MATCHED  THEN
INSERT  (column_list)
VALUES  (column_values);
还是
MERGE 
INTO  table_name  AS  table_alias
USING (
table | view | sub_query)  AS  alias
ON  ( join  condition)
WHEN  MATCHED  THEN
UPDATE  table_name  SET
col1 
=  col_val1,
col2 
=  col2_val
WHEN   NOT  MATCHED  THEN
INSERT  (column_list)
VALUES  (column_values);

 

 
下面看个具体的例子:
http://blog.itpub.net/post/468/14844

CREATE   TABLE  T  AS   SELECT  ROWNUM ID, A. *   FROM  DBA_OBJECTS A;

表已创建。

CREATE   TABLE  T1  AS  
SELECT  ROWNUM ID, OWNER, TABLE_NAME,  CAST ( ' TABLE '   AS   VARCHAR2 ( 100 )) OBJECT_TYPE
FROM  DBA_TABLES;

表已创建。

MERGE  INTO  T1 USING T 
 
ON  (T.OWNER  =  T1.OWNER  AND  T. OBJECT_NAME   =  T1.TABLE_NAME  AND  T.OBJECT_TYPE  =  T1.OBJECT_TYPE)
 
WHEN  MATCHED  THEN   UPDATE   SET  T1.ID  =  T.ID
 
WHEN   NOT  MATCHED  THEN   INSERT   VALUES  (T.ID, T.OWNER, T. OBJECT_NAME , T.OBJECT_TYPE);

6165 行已合并。

SELECT  ID, OWNER,  OBJECT_NAME , OBJECT_TYPE  FROM  T
 MINUS
 
SELECT   *   FROM  T1;

未选定行
MERGE语法其实很简单,下面稍微修改一下例子。
SQL> DROP TABLE T;
表已丢弃。
SQL> DROP TABLE T1;
表已丢弃。
SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;
表已创建。
SQL> CREATE TABLE T1 AS SELECT ROWNUM ID, OWNER, TABLE_NAME FROM DBA_TABLES;
表已创建。
SQL> MERGE INTO T1 USING T
2 ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME)
3 WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
4 WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME);
MERGE INTO T1 USING T
*
ERROR 位于第 1 行:
ORA-30926: 无法在源表中获得一组稳定的行
这个错误是使用MERGE最常见的错误,造成这个错误的原因是由于通过连接条件得到的T的记录不唯一。最简单的解决方法类似:
SQL> MERGE INTO T1
2 USING (SELECT OWNER, OBJECT_NAME, MAX(ID) ID FROM T GROUP BY OWNER, OBJECT_NAME) T
3 ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME)
4 WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
5 WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME);
5775 行已合并。
另外,MERGE语句的UPDATE不能修改用于连接的列,否则会报错,详细信息可以参考:

===============================================================

ref: http://tomszrp.itpub.net/post/11835/263865

在Oracle 10g之前,merge语句支持匹配更新和不匹配插入2种简单的用法,在10g中Oracle对merge语句做了增强,增加了条件选项和DELETE操作。下面我通过一个demo来简单介绍一下10g中merge的增强和10g前merge的用法。

 

参考Oracle 的SQL Reference,大家可以看到Merge Statement的语法如下:
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;


下面我在windows xp 下10.2.0.1版本上做一个测试看看

  
相关文章
|
1月前
|
Oracle 关系型数据库 数据库
Oracle中merge Into的用法
Oracle中merge Into的用法
|
7月前
|
SQL Oracle 关系型数据库
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
701 0
|
8月前
|
Oracle 关系型数据库 数据库
一篇文章教你学会使用Oracle 数据库中、WITH 临时表名 AS ()语法
一篇文章教你学会使用Oracle 数据库中、WITH 临时表名 AS ()语法
69 0
|
8月前
|
Oracle 关系型数据库 数据库
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
311 0
|
8月前
|
SQL Oracle 关系型数据库
Oracle 数据库 常见SQL语法
Oracle 数据库 常见SQL语法
125 0
|
10月前
|
存储 SQL Oracle
Oracle存储过程~基本语法
Oracle存储过程~基本语法
|
SQL Oracle 关系型数据库
在Oracle中,什么是Quote(q) Q语法?
在Oracle中,什么是Quote(q) Q语法?
150 0
|
Oracle 关系型数据库
oracle学习58-plsql轻量版基本语法
oracle学习58-plsql轻量版基本语法
144 0
oracle学习58-plsql轻量版基本语法
|
存储 SQL Oracle
Oracle触发器语法及实例
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
141 0

推荐镜像

更多