`

Oracle merge语句

 
阅读更多

http://blog.csdn.net/yuzhic/article/details/1896878

动机:

想在Oracle中用一条SQL语句直接进行Insert/Update的操作。

说明:

在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)。

实战:

接下来我们有一个任务,有一个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录。在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下:

if exists(select 1 from T where T.a='1001' ) update T set T.b=2 Where T.a='1001' else insert into T(a,b) values('1001',2);

以上语句表明当T表中如果存在a='1001' 的记录的话,就把b的值设为2,否则就Insert一条a='100',b=2的记录到T中。

但是接下来在Oracle中就遇到麻烦了,记得在Oracle 9i之后就有一条Merge into 的语句可以同时进行Insert 和Update的吗,Merge的语法如下:

MERGE  INTO  table_name alias1 
USING (
table | view | sub_query) alias2
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); 

 

上面的语法大家应该都容易懂吧,那我们按照以上的逻辑再写一次。

MERGE  INTO  T T1
USING (
SELECT  a,b  FROM  T  WHERE  t.a = ' 1001 ' ) T2
ON  ( T1.a = T2.a)
WHEN  MATCHED  THEN
  
UPDATE   SET  T1.b  =   2
WHEN   NOT  MATCHED  THEN  
  
INSERT  (a,b)  VALUES ( ' 1001 ' , 2 );

以上的语句貌似很对是吧 ,实际上,该语句只能进行更新,而无法进行Insert,错误在哪里呢?

其实在Oracle中Merge语句原先是用来进行整表的更新用的,也就是ETL工具比较常用的语法,重点是在Using上。

用中文来解释Merge语法,就是:

在alias2中Select出来的数据,每一条 都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

因此,严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”

以上这句话也就很好的解释了在上面写的语句为何只能进行Update,而不能进行Insert了,因为都Select不到数据,如何能进行Insert呢:)

接下来要改成正确的语句就容易多了,如下:

MERGE  INTO  T T1
USING (
SELECT   ' 1001 '   AS  a, 2   AS  b  FROM  dual)  T2
ON  ( T1.a = T2.a)
WHEN  MATCHED  THEN
  
UPDATE   SET  T1.b  =  T2.b
WHEN   NOT  MATCHED  THEN  
  
INSERT  (a,b)  VALUES (T2.a,T2.b);

查询结果,OK!

注意:

如果不懂Merge语句的原理,Merge语句是一条比较危险的语句,特别是在您只想更新一条记录的时候,因为不经意间,你可能就把整表的数据都Update了一遍.....汗!!!

我曾经犯过的一个错误如下所示,大家看出来是什么问题了吗?

MERGE  INTO  T T1
USING (
SELECT   Count ( * ) cnt  FROM  T  WHERE  T.a = ' 1001 ' ) T2
ON  (T2.cnt > 0 )
WHEN  MATCHED  THEN
  
UPDATE   SET  T1.b  =  T2.b
WHEN   NOT  MATCHED  THEN  
  
INSERT  (a,b)  VALUES (T2.a,T2.b);
分享到:
评论

相关推荐

    Oracle_merge

    ### Oracle Merge 语句详解 #### 一、引言 在数据库管理中,尤其是在处理大量数据的场景下,高效地更新或插入数据是一项至关重要的任务。Oracle 9i R2 版本引入了一种名为 `MERGE` 的新功能,这一功能在业界被称为...

    MySQL中实现插入或更新操作(类似Oracle的merge语句)

    在Oracle数据库中,这种操作可以通过`MERGE`语句轻松完成。然而,MySQL并不直接支持`MERGE`语句,但我们可以使用`INSERT ... ON DUPLICATE KEY UPDATE`语法来达到类似的效果。 `INSERT ... ON DUPLICATE KEY UPDATE...

    oracle merge 用法详解

    自Oracle 9i版本开始,Oracle数据库引入了一个非常强大的SQL语句——`MERGE`命令。通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`INSERT`)和更新(`UPDATE`)操作,极大地简化了数据处理流程并提高了...

    oracle merge into的使用

    描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为灵活和高效的数据管理方式。在...

    Oracle merge into用法

    在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...

    oracle Merge 函数.doc

    Oracle Merge 函数是一种强大的数据操作语句,用于从一个表中选择一些数据更新或者插入到另一个表中。Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge ...

    update语句的优化-oracle .pdf

    总结来说,针对Oracle数据库的update语句的优化,主要可以从简化SQL语句结构、合理使用子查询和join操作、采用merge语句以及编写PL/SQL游标处理等多方面入手。在实际应用中,根据具体情况选择合适的优化方案,能够...

    Oracle中merge into的使用

    在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...

    oracle死锁原因解决办法

    ### Oracle死锁原因及解决办法 #### 一、Oracle死锁概述 在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。...

    oracle sql 语句暗示 hints

    ### Oracle SQL 语句暗示 (Hints) 全面解析 #### 一、引言 在当前企业级应用环境中,为了实现成本控制与性能优化的目标,高效编写应用程序变得尤为重要。这不仅涉及程序的设计与实现,还包括运行时资源的有效利用...

    Oracle中SQL语句执行效率的查找与解决

    - **连接操作**:Oracle支持多种连接算法,包括嵌套循环连接(Nested Loops)、排序合并连接(Sort-Merge Join)和哈希连接(Hash Join)。每种算法有其优缺点,应根据数据量大小、数据分布情况和可用内存等因素选择...

    Oracle merge合并更新函数实例详解

    Oracle的MERGE语句是一种强大的数据操作工具,它在Oracle9i版本中被引入,用于合并UPDATE和INSERT操作。在处理需要根据特定条件更新或插入数据的场景时,MERGE语句提供了高效的解决方案,尤其适合那些需要在单个SQL...

    浅谈Oracle数据库中Merge Into的用法.pdf

    在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则是“有则更新,无则插入”。 Merge ...

    oracle dba

    在Oracle数据库中,`MERGE`语句是一种非常强大的工具,用于更新或插入数据,取决于源表中的数据是否存在于目标表中。题目中提到的`MERGE INTO t1 USING t2 ON (join predicate)`语法展示了`MERGE`的基本用法。 - **...

    使用BULK COLLECT, MERGE 语句提高sql执行效率

    详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询

    Oracle MERGE INTO的用法示例介绍

    1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 — 避免了分开更新 — 提高性能并易于使用 — 在数据仓库应用中十分有用 2)MERGE语句的...

    Oracle SQL 语句学习

    DML语句包括SELECT、INSERT、UPDATE、DELETE、MERGE等,用于数据行的查询、插入、修改和删除。DDL语句包括CREATE、ALTER、DROP、RENAME、TRUNCATE等,用于创建、修改、删除数据库对象。事务控制语句如COMMIT、...

    oracle学习及练习语句

    `oracle-merge.txt`文件则介绍了MERGE语句,它能够根据一个源表的数据更新或插入到目标表中,同时处理重复记录的问题。 5. Oracle SQL语句练习:`Oracle_sql语句练习.txt`和`oracle-sql练习2.txt`可能包含了各种SQL...

Global site tag (gtag.js) - Google Analytics