`
leeqq
  • 浏览: 137033 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

merge into使用方法

阅读更多

       在维护代码的时候,看见merge into语句,遂查询记录如下。

       在往数据库里保存数据的时候时常会遇到这种情况。如果一条记录已经存在,则更新相应的记录,如果不存在则插入这条新的记录。这时候就可以使用这个merge into来进行操作。至于如何判断一条记录是否存在,可以自己定义对应的判断条件。

其基本语法如下

merge into 表名 表别名 using 表名 表别名 on 条件

    when matched then update .........

    when not matched then insert.........

下面实际操作来看一下。

有如下表


对此表进行如下merge操作

MERGE INTO COURSE C 
USING (SELECT C.CNO+5 as CNO,C.CNAME,C.TNO FROM COURSE C) NEWC 
ON(C.CNO = NEWC.CNO) 
WHEN MATCHED THEN 
    UPDATE SET C.TNO=NEWC.TNO 
WHEN NOT MATCHED THEN 
    INSERT VALUES(NEWC.CNO,NEWC.CNAME,NEWC.TNO)

 先看第二行using部分,这里是从原表选取数据,如果有其他表,当然可以换成其他表,这里不再建其他表,直接使用原表。在using后面的括号里面所选取出来的数据如下

此表命名为NEWC。将会用此表往原表merge,也就是SQL文merge into后面写的那张表course。

下面就要判断条件,判断NEWC中的记录是否已经存在。判断条件就是用ON关键字来提示的。这里的条件是
 C.CNO = NEWC.CNO,也就是说如果原表C中已经存在相应的CNO的记录,表示该记录已经存在。对比发现CNO为6~10的记录在原表已经存在, 表示匹配,也是就matched,执行update子句,而cno为11~15的记录不存在,也就是not matched,执行insert子句。

执行结果如下。

 发现原来06~10的记录TNO字段被更新,并且新插入了CNO为11~15的记录。

当然在merge的时候,可以只选用update不用insert,或者只选用insert不用update。这里不再举例。

 

这是merge最基本的用法了,当然如果愿意,可以在update或者insert后面添加where判断,只更新或者只插入满足where条件的记录,

将表恢复至原来状态,修改上面的SQL如下。

MERGE INTO COURSE C 
USING (SELECT C.CNO+5 as CNO,C.CNAME,C.TNO FROM COURSE C) NEWC 
ON(C.CNO = NEWC.CNO) 
WHEN MATCHED THEN 
    UPDATE SET C.TNO=NEWC.TNO 
        WHERE C.CNAME='PHP'
WHEN NOT MATCHED THEN 
    INSERT VALUES(NEWC.CNO,NEWC.CNAME,NEWC.TNO) 
        WHERE NEWC.CNO<'12'

 所得结果如下

对比发现,并不想第一条SQL那样,现在只更新了CNO为09的记录,也就是CNAME为PHP的记录。插入的时候只插入了CNO为11的记录,满足条件CNO<12。

 

       在使用insert的时候,可以只插入部分字段,写法如下

       INSERT(CNO, TNO) VALUES(NEWC.CNO, NEWC.TNO)

这样得到的结果就是插入记录的时候只插入CNO和TNO字段的值,而CNAME将会为空。具体不再演示。

 

    在update后面还可配合delete语句,在更新的同时删除某些记录。

    仍然把表回复原样,进行如下操作。

MERGE INTO COURSE C 
USING (SELECT C.CNO+5 as CNO,C.CNAME,C.TNO FROM COURSE C) NEWC 
ON(C.CNO = NEWC.CNO) 
WHEN MATCHED THEN 
UPDATE SET C.TNO=NEWC.TNO 
DELETE WHERE C.CNO>'09'

 所得结果如下

对比发现,CNO为06~09的记录被更新,原有的CNO为10的记录被删除。

 

这里被删除记录不仅要满足DELETE关键字后面的where条件,还要满足ON关键字后面的条件,还要满足UPDATE后面where条件。

对原始表如下操作

MERGE INTO COURSE C 
USING (SELECT C.CNO+5 as CNO,C.CNAME,C.TNO FROM COURSE C) NEWC 
ON(C.CNO = NEWC.CNO)
WHEN MATCHED THEN 
    UPDATE SET C.TNO=NEWC.TNO WHERE C.CNO>'06' 
    DELETE WHERE C.CNAME='C#'

 
 所得结果如下

 对比发现只更新CNO为06~10的记录,符合update语句后面的where条件,然而并没有删除CNAME为'C#'的记录原因是该条记录不满足update语句后面的where条件。

 

merge into的用法大致记录如上,有待后面实际的应用

 

 

  • 大小: 3.4 KB
  • 大小: 3.4 KB
  • 大小: 4.8 KB
  • 大小: 3.6 KB
  • 大小: 3.2 KB
  • 大小: 3.4 KB
分享到:
评论

相关推荐

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...

    Merge into的使用详解

    本篇文章将详细介绍`MERGE INTO`的使用,包括两种常见的写法,并通过实例进行说明。 一、`MERGE INTO`的基本语法 `MERGE INTO`语句的基本结构如下: ```sql MERGE INTO target_table USING source_table ON (join...

    oracle merge into的使用

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

    Oracle中merge into的使用

    以下是一些`MERGE INTO`的使用示例: 1. **更新匹配的记录**: ```sql MERGE INTO products p USING newproducts np ON (p.product_id = np.product_id) WHEN MATCHED THEN UPDATE SET p.product_name = np....

    Oracle merge into用法

    `MERGE INTO`语句的一个关键优势是它允许使用`WHERE`子句来细化更新和插入的规则。这意味着你可以控制哪些记录会被更新,哪些记录会被插入,甚至可以排除某些特定的记录不进行任何操作。这种精细的控制能力对于数据...

    Merge Into 语句代替InsertUpdate

    非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者

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

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

    DB2 MERGE INTO语句的使用

    DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以根据条件进行插入、删除、更新等操作,功能非常强大。

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

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

    利用 sqluldr2导出数据 使用sqlldr导入数据 通过merge into 合并更新数据

    下面将详细阐述如何使用这两个工具以及如何通过`MERGE INTO`语句进行数据合并更新。 1. SQLULDR2导出数据: SQLULDR2是Oracle提供的一款数据导出工具,它能够快速地将数据库中的数据导出到文本文件或其他格式的...

    Hibernate中的merge使用详情解说

    例如,如果我们在使用 merge 方法前没有设置对象的 ID,那么 merge 方法将抛出异常。 在使用 merge 方法时,我们还需要注意 Session 的生命周期。在上面的示例代码中,我们可以看到,在第一个 Session 中,我们使用...

    pybigquery-merge-into:向pybigquery添加MERGE INTO支持

    主要类是pybigquery_merge_into.merge_clause.MergeInto() 。 例子 &gt;&gt; &gt; query = MergeInto ( target = target , source = source , onclause = target . c . t1 == source . c . s1 , when_clauses = [ ...

    oracle中merge into用法及实例解析

    虽然`MERGE INTO`本身不直接支持删除操作,但可以通过在`WHEN MATCHED THEN`部分使用`DELETE`语句结合特定条件来实现,例如删除不再存在于源表中的目标表记录。 通过这些用法,我们可以高效地管理数据,并在单个...

    merge用法详解(实例详解)

    【知识点详解】 ...通过以上介绍,我们了解了`MERGE INTO`语句的基本概念和使用方法,以及在实际场景中如何进行数据同步。在数据库管理和ETL过程中,合理运用`MERGE`能有效地提高数据处理的效率和准确性。

    oracle Merge 函数.doc

    Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge 函数的基本语法结构为: ```sql MERGE INTO 目标表 USING 来源表 ON (条件) WHEN MATCHED THEN 更新操作 ...

    oracle死锁原因解决办法

    ##### 3.2 使用跟踪文件 除了alert.log外,Oracle还会为每个死锁生成一个跟踪文件(trace file),该文件包含了更多关于死锁的信息。在上述示例中提到的跟踪文件路径为 `e:\oracle\admin\GEDEON\udump\ORA01784.TRC...

    oracle数据匹配merge into的实例详解

    Oracle的`MERGE INTO`语句是一种强大的工具,用于根据源数据更新或插入目标表的记录。这个SQL命令结合了`INSERT`, `UPDATE`和`DELETE`操作,使得在处理数据匹配和同步时更加高效。在给定的实例中,`MERGE INTO`被...

    Mysql合并表Merge引擎

    1.Merge(MRG_MyISAM)存储引擎类型允许你把许多结构相同的表合并为一个表。当从合并表中执行查询,从多个表返回的结果就像从一个表返回的结果一样。 2.要创建合并表的前提是每一个合并的表必须有同样的表定义(表结构...

Global site tag (gtag.js) - Google Analytics