`
xo_tobacoo
  • 浏览: 384077 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

oracle使用 merge 更新或插入数据(总结)

阅读更多
总结下。使用merge比传统的先判断再选择插入或更新快很多。
1)主要功能
提供有条件地更新和插入数据到数据库表中
如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作
    — 避免了分开更新
    — 提高性能并易于使用
    — 在数据仓库应用中十分有用

2)MERGE语句的语法如下:

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;


还是看例子就知道怎么回事:
MERGE INTO copy_emp c   
USING employees e   
ON (c.employee_id=e.employee_id)   
WHEN MATCHED THEN  
UPDATE SET  
c.first_name=e.first_name,   
c.last_name=e.last_name,   
c.department_id=e.department_id   
WHEN NOT MATCHED THEN  
INSERT VALUES(e.employee_id,e.first_name,e.last_name,   
e.email,e.phone_number,e.hire_date,e.job_id,   
e.salary,e.commission_pct,e.manager_id,   
e.departmetn_id); 
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id=e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name=e.first_name,
c.last_name=e.last_name,
c.department_id=e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id,e.first_name,e.last_name,
e.email,e.phone_number,e.hire_date,e.job_id,
e.salary,e.commission_pct,e.manager_id,
e.departmetn_id);


3)使用merge的注意事项:
创建测试表:
CREATE TABLE MM (ID NUMBER, NAME VARCHAR2(20));
CREATE TABLE MN (ID NUMBER, NAME VARCHAR2(20));
插入数据
INSERT INTO MM VALUES (1, 'A');
INSERT INTO MN VALUES (1, 'B');
执行:
MERGE INTO MN A
    USING MM B
    ON(A.ID=B.ID)
    WHEN MATCHED THEN
    UPDATE SET A.ID = B.ID
    WHEN NOT MATCHED THEN
    INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)
报错,原因是on子句的使用的字段不能够用于update,即Oracle不允许更新用于连接的列
修改:
MERGE INTO MN A
    USING MM B
    ON(A.ID=B.ID)
    WHEN MATCHED THEN
    UPDATE SET A.NAME = B.NAME
    WHEN NOT MATCHED THEN
    INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)

再插入:INSERT INTO MM VALUES (1, 'C');
再执行:
MERGE INTO MN A
    USING MM B
    ON(A.ID=B.ID)
    WHEN MATCHED THEN
    UPDATE SET A.NAME = B.NAME
    WHEN NOT MATCHED THEN
    INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)
报错,原因无法在源表中获得一组稳定的行

4)更新同一张表的数据。需要注意下细节,因为可能涉及到using的数据集为null,所以要使用count()函数。
MERGE INTO mn a
   USING (select count(*) co from mn where mn.ID=4) b
   ON (b.co<>0)--这里使用了count和<>,注意下,想下为什么!
   WHEN MATCHED THEN
      UPDATE
         SET a.NAME = 'E'
         where a.ID=4
   WHEN NOT MATCHED THEN
      INSERT
      VALUES (4, 'E');

4
2
分享到:
评论

相关推荐

    oracle使用 merge

    oracle使用 merge 更新或插入数据(总结@新

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

    主要介绍了在MySQL中实现插入或更新操作(类似Oracle的merge语句)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Oracle_merge

    在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行。。。。。。

    oracle merge

    merge 详解 及实例 优点:  — 避免了分开更新  — 提高性能并易于使用  — 在数据仓库应用中十分有用  — 使用merge比传统的先判断再选择插入或更新快很多

    Oracle MERGE INTO的用法示例介绍

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

    merge_row_count:一个简单的实用程序,允许对由 Oracle 中的合并操作插入更新删除的行进行计数

    一个简单的实用程序 PL/SQL 包,允许对 Oracle 中的合并操作插入/更新/删除的行进行计数。 包的需要 Oracle不提供获取行数的功能。 插入 更新 已删除 使用 MERGE 操作完成所有操作时。 这个简单的实用程序是为了...

    oracle中merge into用法及实例解析

    作用:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表但是有很多可选项,如下: 1.正常模式 2.只update或者只insert 3.带条件的update或带条件的insert 4.

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    Oracle SQL高级编程

    《Oracle SQL高级编程》:资深Oracle专家力作,OakTable团队推荐,全面、独到、翔实,题材丰富,Oracle开发人员和DBA必备。 媒体推荐 本书作者全部是OakTable的成员,且具有15-29年丰富的Oracle开发经验。在研究...

    达梦数据库sql语言使用手册

    达梦数据库sql语言手册,达梦数据库是国产数据库里最好使用的,可以跟oracle数据无缝替换的

    oracle学习经典教程

    1.2.1.6.2 使用IS NULL 或IS NOT NULL ......30 1.2.1.6.3 使用函数.........30 1.2.1.6.4 比较不匹配的数据类型...............30 1.2.1.7 查询索引..................30 1.2.1.8 组合索引..............

    oracle从入门到精通

    3、数字和日期都可以使用数学运算符建立表达式。 ...............................................................9 4、定义空(NULL)值 ....................................................................

    Oracle事例

    sql&gt; alter index xay_id allocate extent(size 200k datafile \'c:/oracle/index.dbf\'); &lt;8&gt;.alter index xay_id deallocate unused; 、查看索引 SQL&gt;select index_name,index_type,table_name from user...

    OCA认证考试指南1Z0-051

    7.1 使用同等连接和非同等连接编写SEIECT语句访问多个表的数据 7.1.1 连接的类型 7.1.2 使用SQL:1999语法连接表 7.1.3 限定模糊的列名 7.1.4 NATURALJOIN子句 7.1.5 自然JOINUSING子句 7.1.6 自然JOIN...

    TianleSoftware Oracle中文学习手册

    1.2.1.6.2 使用 IS NULL 或 IS NOT NULL ............................................................... 1.2.1.6.3 使用函数 ..................................................................................

    Oracle从入门到精通

    7. tablespace 表空间:一个或多个数据文件的逻辑组成。 ..... 8. redo log file 重做日志文件............................. 9. control file 控制文件 ................................. 10. parameter file 初始...

    精通SQL数据库连接.doc

    别名是一个SQL功能,他允许你在一个查询中为表格或专栏创建一个速记符号,他在处理自连接时也可以很便利地使用,这一点我会在后面提到。 一个别名通用的格式是table_name.column_name AS alias,他允许你通过指派的...

Global site tag (gtag.js) - Google Analytics