zoukankan      html  css  js  c++  java
  • MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)

    MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
    通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 
    语法为
    *************************************************************
    MERGE [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
    **************************************************************
    Oracle 10g中MERGE有如下一些改进:
    1、UPDATE或INSERT子句是可选的
    2、UPDATE和INSERT子句可以加WHERE子句
    3、ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
    4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的

    这里说一下我自己的理解:
    第一点意思是可以在MERGE INTO语法中只写WHEN MATCHED THEN或者只写WHEN NOT MATCHED THEN。这里不再赘述。
    第二点意思是我们可以在THEN后的UPDATE或者INSERT语句后面加上WHERE条件,比如有这样的需求:当A表中的ID在B表中不存在时进行插入。当存在时,A表的NAME不为空时进行更新。这种情况就需要在UPDATE字句后+WHERE条件。
    第三点意思是我们可以在ON条件中不进行目标表和USING表的关联,可以在ON条件中写如1=1这样的条件。比如我们有这样的需求:当isAllAdd参数为false时,进行正常的MERGE INTO。当isAllAdd参数为true时,全部执行插入。我们就可以使用这个新特性,对ON中的条件进行筛选从而达到一条sql即可满足业务的目的。
    第四点意思是我们不止可以在MERGE INTO中进行插入更新,还可以对匹配的数据进行删除操作。这个点非常重要,个人认为第四点是这次改进中最需要我们学习的一点。比如我们有这样的需求:A表中有期中学生ID,考试年份、考试成绩、期末考试成绩四个字段。我们给期末考试成绩做批量删除功能,当没有期中考试成绩时,删除该数据。当有期中考试成绩时,将期末考试成绩置空。传统写法将需要删除的人员的List中的信息其数据库进行查询,看其中的每一条是执行修改还是删除,在分别调用。我们现在只需要
    MERGE INTO A
    USING (TABLE EMPLOYEE) B
    ON (A.EMPLOYEEID = B.EMPLOYEEID AND A.YEAR = B.YEAR)
    WHEN MATCHED THEN
    UPDATE SET 期中考试成绩 = ""
    DELETE WHERE 期末考试成绩 IS NULL

    特别说明:
    DELETE字句只能写在MATCHED情况中,不匹配时无法删除会报错。
    当DELETE跟在UPDATE字句之后时,DELETE字句是针对UPDATE字句修改后的数据进行过滤的。比如需要删除所有C字段="1"的数据,UPDATE字句将所有数据的C字段都更新为1,那么会删除所有数据,而不是原本为1的数据。

    原文:http://www.2cto.com/database/201312/261897.html

  • 相关阅读:
    dev 调用汉化资源
    GridViewDataHyperLinkColumn 显示与内容分离
    gmail 邮箱找回方法
    C# 拼接 in 查询字符串
    asp.net ajax
    解决vmware 因为网络问题而引起的异常
    从改工具到改模型
    Orchard源码:EventBus&EventHandler
    AutoResetEvent和ManualResetEvent理解
    缓存设计
  • 原文地址:https://www.cnblogs.com/azhqiang/p/4699181.html
Copyright © 2011-2022 走看看