MERGE INTO 用法

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

  3. 举例
     
    shop_supplier 门店和经销商关系表 :shop_id (门店表主键 对应门店表的row_id),supplier 经销商ID
     shop_header   门店基础信息表:     row_id (门店表主键,uuid),shop_code 门店编码
    门店经销商关系表存的是门店和经销商关系,存的是门店ID(和门店编码不同)此时要求将A经销商下的部分或者全部门店替换到B经销商下,前台选择原经销商和新经销商传到后台为经销商ID(),输入框输入要替换的门店编码(点击输入门店按钮,显示输入门店框)

    如果不输入门店,则将原经销商下所有门店替换到新经销商门下,(全部替换界面)

    如果输入门店,则替换原经销商下的部分门店到新经销商下(部分替换界面)
    此时用该语句即可解决,
    第一步:判断所输入的所有门店是否有不在原经销商下的,有的话抛出异常,将信息带出
    第二步:用merge into 将原经销商A下的所有或者部分门店替换到新经销商B下
    第三步:将原经销商A下的门店关系删除解绑。
    第一种:全部替换,也即是不输入门店,将A经销商下所有的门店换绑定到B经销商下,sql语句:(supplier1 原经销商ID,supplier2 新经销商ID)
    首先用merge into 将原经销商A下的所有或者部分门店替换到新经销商B下
    MERGE INTO ( SELECT * FROM  shop_supplier T WHERE T .SUPPLIER = 'supplier2') t2 
    USING ( SELECT * FROM  shop_supplier  T WHERE T .SUPPLIER = 'supplier1' )) t1
    ON (t1.SHOP_ID = t2.SHOP_ID)
    WHEN MATCHED THEN
        UPDATE SET t2.UPDATE_DT = SYSDATE,t2.UPDATE_ID = ?
    WHEN NOT MATCHED THEN
        INSERT (t2.ROW_ID,SHOP_ID,SUPPLIER)
    VALUES
        (SYS_GUID(),t1.SHOP_ID,'supplier2')

    然后将将原经销商A下的门店关系删除解绑。

    delete from cx_awk_shop_supplier s where s.SUPPLIER='supplier1'

     

    部分门店类同

     

     

posted @ 2017-03-17 10:03  jackson.gong  阅读(319)  评论(0编辑  收藏  举报