精华内容
下载资源
问答
  • Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
  • 非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者
  • 主要介绍了oracle中merge into用法及实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • oracle数据匹配merge into的实例详解 前言:  很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表的数据进行匹配,这两个表的数据结构一致,一个是正式表,一个是临时表,这两表数据量还算是...
  • DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以根据条件进行插入、删除、更新等操作,功能非常强大。
  • SQL语句merge into的用法

    千次阅读 2020-07-24 13:56:07
    改用 MERGE INTO 代替执行批量更新,会提升执行效率。 merge into将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),好处是避免了多个insert 和update操作。 merge into是一个目标性明确的...

    应用场景

    在批量更新大量的数据时,使用Insert 和Update操作会出现效率低下,甚至卡死的情况。改用 MERGE INTO 代替执行批量更新,会提升执行效率。

    merge into将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),好处是避免了多个insert 和update操作。

    merge into是一个目标性明确的操作符,不允许在一个merge 语句中对相同的行insert或update操作。

    这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于insert+update,尤其是在大数据量面前,效率越明显。

    语法

    语法如下:

    MERGE INTO table_name alias1
    USING (table|view|sub_query) alias2
    ON (join condition)
    WHEN MATCHED THEN
    UPDATE
    SET col1 = col1_val1,
        col2 = col2_val2
    WHEN NOT MATCHED THEN
    INSERT (column_list) VALUES (column_values);
    

    其中,table_name 指的是更新的表,using()里边的指的是数据来源表/视图/子查询结果集,condition指的是连接条件。
    如果满足连接条件,则更新字段;如果连接条件不满足,则停止更新进行插入。

    举例

    table_a : 计划金额表

    table_b : 调整表

    table_c : 调整金额表

    想要根据调整id,将调整金额累加到计划金额表中。一次更新当年12个月。

    MERGE INTO table_a t1 USING (
    	SELECT
    		m.plan_id,
    		m.adjust_money + d.adjust_money adjust_money,
    		m.all_money + d.adjust_money all_money
    	FROM
    		table_a m
    	LEFT JOIN table_b a ON m.card_id = a.card_id
    	LEFT JOIN table_c d ON a.adjust_id = d.adjust_id
    	WHERE
    		a.adjust_id = 5
    	AND a.comp_code = '100101'
    	AND m.year = d.year
    ) t2 ON (t1.plan_id = t2.plan_id)
    WHEN matched THEN
    	UPDATE
    SET t1.adjust_money = t2.adjust_money,
     t1.all_money = t2.all_money
    
    展开全文
  • 使用merge into进行大数据量优化

    千次阅读 2020-03-09 00:21:44
    insert into tableA select xx from tableB 或者使用 <foreach collection="pd.mapListImpt" item="item" index="index" open="begin" close=";end;" separator=";" > update tableA <set> a=.....

    传统方式:

    insert into tableA select xx from tableB
    

    或者使用

    <foreach collection="pd.mapListImpt" item="item" index="index" open="begin" close=";end;" separator=";" >
    update tableA
    			<set>
    				a= #{pd.mapListImpt[${index}].a,jdbcType=VARCHAR},
    				b= #{pd.mapListImpt[${index}].b,jdbcType=VARCHAR},
    
    				c=#{pd.mapListImpt[${index}].c,jdbcType=VARCHAR},
    				d= #{pd.mapListImpt[${index}].d,jdbcType=VARCHAR},
    
    				e=  #{pd.mapListImpt[${index}].e,jdbcType=VARCHAR},
    
    				f=  #{pd.mapListImpt[${index}].f,jdbcType=VARCHAR},
    				g=  #{pd.mapListImpt[${index}].g,jdbcType=VARCHAR},
    
    
    				h=#{pd.h,jdbcType=VARCHAR},
    				UpdateOperater=#{pd.userCode,jdbcType=VARCHAR},
    				UpdateDate=to_date(to_char(sysdate,'yyyy-MM-dd'),'yyyy-MM-dd'),
    				UpdateTime=to_char(sysdate, 'HH24:mi:ss')
    			</set>
    			where ad=#{pd.mapListImpt[${index}].ad,jdbcType=VARCHAR}
    </foreach>
    

    优化方式

    使用merge into
    以下写的例子,以供以后参考

    <insert id="insertCEBPN_Con_ContriLs" statementType="PREPARED" parameterType="pd">
    		merge into PN_Con_ContriLs pnc
        using(
           select
             pcc.contrilsid contrilsid,
             pcc.contributionid contributionid,
    
             pcc.PlanID PlanID,
             pcc.EnterprisedeID EnterprisedeID,
             pcc.SubEnterprisedeID SubEnterprisedeID,
             pcc.productid productid,
             pcc.StaffID StaffID,
             pcc.name name,
             pcc.IdNo IdNo,
             nvl(pcc.EContTaxApply,'0') + pcc(pnc.ECMoney,'0') ECTotal,
             nvl(pcc.SContTaxApply,'0') + pcc(pnc.SCMoney,'0') SCTotal,
             pcc.CSumMoney CSumMoney,
             pcc.EContTaxApply EContTaxApply,
    			   pcc.SContTaxApply SContTaxApply,
    			   pcc.ECMoney ECMoney,
    			   pcc.SCMoney SCMoney,
             pcc.expandfield2 expandfield2
          from pn_con_contrils_temp pcc
          where pcc.contributionid = #{pd.ContributionID,jdbcType=VARCHAR}
    				    and pcc.expandfield4 = #{pd.ContriLsIDLSPay,jdbcType=VARCHAR}
        )t on(pnc.contributionid=t.contributionid)
        when not matched then
        insert (pnc.ContriLsID,pnc.ContributionID,pnc.planid,pnc.EnterprisedeID,pnc.SubEnterprisedeID,pnc.ProductID,pnc.StaffID,pnc.name,  pnc.IdNo,
    		   pnc.EContTotalLs,pnc.SContTotalLs, pnc.ContTotalLs,pnc.EContTaxTotalLs,pnc.SContTaxTotalLs,pnc.EContApply,pnc.SContApply,
    		   pnc.OperateOrg, pnc.Operater,pnc.MakeDate, pnc.MakeTime,pnc.UpdateOperater,pnc.UpdateDate,pnc.UpdateTime,pnc.ContriListFileID,pnc.ContriAccountType)
        values(
             t.contrilsid,
             t.contributionid,
             t.PlanID,
             t.EnterprisedeID,
             t.SubEnterprisedeID,
             t.productid,
             t.StaffID,
             t.name,
             t.IdNo,
             t.ECTotal,
             t.SCTotal,
             t.CSumMoney,
             t.EContTaxApply,
             t.SContTaxApply,
             t.ECMoney,
             t.SCMoney,
             #{pd.comCode, jdbcType = VARCHAR},
             #{pd.userCode, jdbcType = VARCHAR},
             to_date(to_char(sysdate, 'yyyy-MM-dd'), 'yyyy-MM-dd'),
             to_char(sysdate, 'HH24:mi:ss'),
             #{pd.userCode, jdbcType = VARCHAR},
             to_date(to_char(sysdate, 'yyyy-MM-dd'), 'yyyy-MM-dd'),
             to_char(sysdate, 'HH24:mi:ss'),
             #{pd.FileID, jdbcType = VARCHAR},
             t.expandfield2
          )
    	</insert>
    
    <insert id="updateCEBPN_Con_ContriLs" statementType="PREPARED" parameterType="pd">
    		merge into PN_Con_ContriLs pnc
    using(
           select
               pcc.contrilsid ContriLsID,
               pcc.contributionid ContributionID,
               pcc.name Name,
               pcc.idno IDNo,
               pcc.EContTaxApply,
               pcc.ECMoney,
               (nvl(pcc.EContTaxApply,'0')+nvl(pcc.ECMoney,'0')) EContTotalLs,
               pcc.SContTaxApply,
               pcc.SCMoney,
               (nvl(pcc.SContTaxApply,'0')+nvl(pcc.SCMoney,'0')) SContTotalLs,
               pcc.CSumMoney
        from pn_con_contrils_temp pcc
        where pcc.contributionid = #{pd.ContributionID,jdbcType=VARCHAR}
          	  and pcc.expandfield4 = #{pd.ContriLsIDLSPay,jdbcType=VARCHAR}
          )t  on(t.contributionid = pnc.contributionid and pnc.Name = t.Name and pnc.IDNo = t.IDNo)
    WHEN MATCHED THEN
    			UPDATE  SET
               		   pnc.EContTotalLs = t.EContTotalLs,
    				   pnc.SContTotalLs = t.SContTotalLs,
    				   pnc.EContTaxTotalLs = t.EContTaxApply,
    				   pnc.SContTaxTotalLs = t.SContTaxApply,
    				   pnc.ContTotalLs =  t.CSumMoney,
    				   pnc.EContApply=  t.ECMoney,
    				   pnc.SContApply=  t.SCMoney,
    
    				   pnc.ContriListFileID=#{pd.FileID,jdbcType=VARCHAR},
    				   pnc.UpdateOperater=#{pd.userCode,jdbcType=VARCHAR},
    				   pnc.UpdateDate=to_date(to_char(sysdate,'yyyy-MM-dd'),'yyyy-MM-dd'),
    				   pnc.UpdateTime=to_char(sysdate, 'HH24:mi:ss')
    	</insert>
    

    下面是参考的其他博主的记录,以供日后学习
    转载自:https://blog.csdn.net/jeryjeryjery/article/details/70047022


    merge into的形式:

    MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
    WHEN MATCHED THEN
    	[UPDATE sql]
    WHEN NOT MATCHED THEN
    	[INSERT sql]
    

    作用:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表但是有很多可选项,如下:

    1.正常模式

    2.只update或者只insert

    3.带条件的update或带条件的insert

    4.全插入insert实现

    5.带delete的update(觉得可以用3来实现)
    下面一一测试。

    测试建以下表:

    
     
    1. create table A_MERGE
    2. (
    3. id NUMBER not null,
    4. name VARCHAR2( 12) not null,
    5. year NUMBER
    6. );
    7. create table B_MERGE
    8. (
    9. id NUMBER not null,
    10. aid NUMBER not null,
    11. name VARCHAR2( 12) not null,
    12. year NUMBER,
    13. city VARCHAR2( 12)
    14. );
    15. create table C_MERGE
    16. (
    17. id NUMBER not null,
    18. name VARCHAR2( 12) not null,
    19. city VARCHAR2( 12) not null
    20. );
    21. commit;
    其表结构截图如下图所示:

    A_MERGE表结构:


    B_MERGE表结构


    C_MERGE表结构


    1.正常模式

    先向A_MERGE和B_MERGE插入测试数据:

    
     
    1. insert into A_MERGE values( 1, 'liuwei', 20);
    2. insert into A_MERGE values( 2, 'zhangbin', 21);
    3. insert into A_MERGE values( 3, 'fuguo', 20);
    4. commit;
    5. insert into B_MERGE values( 1, 2, 'zhangbin', 30, '吉林');
    6. insert into B_MERGE values( 2, 4, 'yihe', 33, '黑龙江');
    7. insert into B_MERGE values( 3, 3, 'fuguo',, '山东');
    8. commit;

    此时A_MERGE和B_MERGE表中数据截图如下:

    A_MERGE表数据:


    B_MERGE表数据:


    然后再使用merge into用B_MERGE来更新A_MERGE中的数据:

    
     
    1. MERGE INTO A_MERGE A USING ( select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON (A.id=C.AID)
    2. WHEN MATCHED THEN
    3. UPDATE SET A.YEAR=C.YEAR
    4. WHEN NOT MATCHED THEN
    5. INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
    6. commit;
    此时A_MERGE中的表数据截图如下:


    2.只update模式
    首先向B_MERGE中插入两个数据,来为了体现出只update没有insert,必须有一个数据是A中已经存在的

    另一个数据时A中不存在的,插入数据语句如下:

    
     
    1. insert into B_MERGE values( 4, 1, 'liuwei', 80, '江西');
    2. insert into B_MERGE values( 5, 5, 'tiantian', 23, '河南');
    3. commit;
    此时A_MERGE和B_MERGE表数据截图如下:
    A_MERGE表数据截图:


    B_MERGE表数据截图:


    然后再次用B_MERGE来更新A_MERGE,但是仅仅update,没有写insert部分。

    
     
    1. merge into A_MERGE A USING ( select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)
    2. WHEN MATCHED THEN
    3. UPDATE SET A.YEAR=C.YEAR;
    4. commit;
    merge完之后A_MERGE表数据截图如下:可以发现仅仅更新了AID=1的年龄,没有插入AID=4的数据


    3.只insert模式
    首先改变B_MERGE中的一个数据,因为上次测试update时新增的数据没有插入到A_MERGE,这次可以用。

    
     
    1. update B_MERGE set year= 70 where AID= 2;
    2. commit;
    此时A_MERGE和B_MERGE的表数据截图如下:
    A_MERGE表数据:


    B_MERGE表数据:


    然后用B_MERGE来更新A_MERGE中的数据,此时只写了insert,没有写update:

    
     
    1. merge into A_MERGE A USING ( select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)
    2. WHEN NOT MATCHED THEN
    3. insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
    4. commit;
    此时A_MERGE的表数据截图如下:



    4.带where条件的insert和update。
    我们在on中进行完条件匹配之后,还可以在后面的insert和update中对on筛选出来的记录再做一次条件判断,用来控制哪些要更新,哪些要插入。
    测试数据的sql代码如下,我们在B_MERGE修改了两个人名,并且增加了两个人员信息,但是他们来自的省份不同,
    所以我们可以通过添加省份条件来控制哪些能修改,哪些能插入:

    
     
    1. update B_MERGE set name= 'yihe++' where id= 2;
    2. update B_MERGE set name= 'liuwei++' where id= 4;
    3. insert into B_MERGE values( 6, 6, 'ningqin', 23, '江西');
    4. insert into B_MERGE values( 7, 7, 'bing', 24, '吉安');
    5. commit;
    A_MGERGE表数据截图如下:


    B_MERGE表数据:


    然后再用B_MERGE去更新A_MERGE,但是分别在insert和update后面添加了条件限制,控制数据的更新和插入:

    
     
    1. merge into A_MERGE A USING ( select B.AID,B.name,B.year,B.city from B_MERGE B) C
    2. ON(A.id=C.AID)
    3. when matched then
    4. update SET A.name=C.name where C.city != '江西'
    5. when not matched then
    6. insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city= '江西';
    7. commit;


    此时A_MERGE截图如下:



    5.无条件的insert。
    有时我们需要将一张表中所有的数据插入到另外一张表,此时就可以添加常量过滤谓词来实现,让其只满足
    匹配和不匹配,这样就只有update或者只有insert。这里我们要无条件全插入,则只需将on中条件设置为永假
    即可。用B_MERGE来更新C_MERGE代码如下:

    
     
    1. merge into C_MERGE C USING ( select B.AID,B.NAME,B.City from B_MERGE B) C ON ( 1= 0)
    2. when not matched then
    3. insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
    4. commit;
    C_MERGE表在merge之前的数据截图如下:


    B_MERGE数据截图如下:


    C_MERGE表在merge之后数据截图如下:



    6.带delete的update
       MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. 
    DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.
    但我觉得这个带where条件的update差不多,都是控制update,完全可以用带where条件的update来实现。







      author:su1573

      展开全文
    • merge into 的用法

      千次阅读 2020-10-23 11:41:12
      merge into 的语法如下所示: MERGE INTO [target-table] T USING [source-table sql] S ON([conditional expression] and [...]...) WHEN MATCHED THEN [UPDATE sql] WHEN NOT MATCHED THEN [INSERT sql] 判断源表...

      1. 语法

      merge into 的语法如下所示:

      MERGE INTO [target-table] T USING [source-table sql] S ON([conditional expression] and [...]...)
      WHEN MATCHED
      THEN [UPDATE sql]
      WHEN NOT MATCHED
      THEN [INSERT sql]
      

      判断源表 S 和目标表 T 是否满足 ON 中的条件,如果满足则用 S 表去更新 T 表,如果不满足,则将 S 表数据插入 T 表中。但是有很多可选项,如下:

      • 普通模式
      • 只 update 或者只 insert
      • 无条件 insert 实现
      • 带 delete 的 update

      2. 测试表

      -- 目标表
      create table target
      (
      id NUMBER not null,
      name VARCHAR2(12) not null,
      year NUMBER
      );
      
      -- 源表
      create table source
      (
      id NUMBER not null,
      aid NUMBER not null,
      name VARCHAR2(12) not null,
      year NUMBER,
      city VARCHAR2(12)
      );
      -- 插入测试数据
      insert into target values(1,'liuwei',20);
      insert into target values(2,'zhangbin',21);
      insert into target values(3,'fuguo',20); 
      
      insert into source values(1,2,'zhangbin',30,'吉林');
      insert into source values(2,4,'yihe',33,'黑龙江');
      insert into source values(3,3,'fuguo','','山东');
      

      两表的的查询结果如下所示:

      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20
               2 zhangbin             21
               3 fuguo                20
      
      SQL> select * from source;
      
              ID        AID NAME               YEAR CITY
      ---------- ---------- ------------ ---------- ------------
               1          2 zhangbin             30 吉林
               2          4 yihe                 33 黑龙江
               3          3 fuguo                   山东
      

      3. 普通模式

      现在简单的使用 merge into 来实现当符合 on 中的条件时则进行更新操作,否则进行插入操作的功能。查看 target 和 source 表,其中 target 表中的 id 和 source 和 aid 是关联的,现在我们要实现当 target 表的 id 与 source 的 aid 匹配时,使用 source 表的 year 去更新 target 表的 year,否则将 source 中的记录插入到 target 表中,具体实现 sql 如下所示:

      merge into target t using source s on (t.id = s.aid)
      when matched then
      update set t.year = s.year
      when not matched then
      insert values(s.aid, s.name, s.year);
      

      执行结果如下所示:

      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20 -- 原有记录
               2 zhangbin             30 -- 更新为 30
               3 fuguo                   -- 更新为 空
               4 yihe                 33 -- 新插入记录
      

      4. 只 update

      还原 target 表的数据,现在来实现当 target 表的 id 与 source 的 aid 匹配时,使用 source 表的 year 去更新 target 表的 year 的操作,具体实现 sql 如下所示:

      merge into target t using (select aid, name, year from source) s on (t.id = s.aid)
      when matched then
      update set t.year = s.year;
      

      执行结果如下所示:

      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20 -- 原有记录
               2 zhangbin             30 -- 更新为 30
               3 fuguo            	   -- 更新为 空
      

      还原 target 表的数据,我们也可以在 update 子句添加限定条件,比如使用 source 表的 year 去更新 target 表的 year 的操作时,限定 source 表的记录除了与 target 是匹配的条件之外,city 必须是吉林的,具体实现 sql 如下:

      merge into target t using source s on (t.id = s.aid)
      when matched then
      update set t.year = s.year where s.city = '吉林';
      

      执行结果如下所示:

      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20 -- 原有记录
               2 zhangbin             30 -- 更新为 30
               3 fuguo                20 -- 原有记录
      
      

      5. 只 insert

      还原 target 表的数据,现在来实现当 target 表的 id 与 source 的 aid 不匹配时,将 source 中的记录插入到 target 表中,具体实现 sql 如下:

      merge into target t using source s on (t.id = s.aid)
      when not matched then
      insert(t.id, t.name, t.year) values(s.aid, s.name, s.year);
      
      

      执行结果如下所示:

      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20 -- 原有记录
               2 zhangbin             21 -- 原有记录
               3 fuguo                20 -- 原有记录
               4 yihe                 33 -- 新增记录
      
      

      insert 子句也可以添加限定条件,类似 update,这里不再赘述。

      6. 无条件 insert

      还原 target 表的数据。有时我们需要将一张表中所有的数据插入到另外一张表,此时就可以添加常量过滤谓词来实现,让其只满足匹配和不匹配,这样就只有update或者只有insert。这里我们要无条件全插入,则只需将on中条件设置为永假即可。用 source 表来更新 target 代码如下:

      merge into target t using source s on(1 = 0) -- 设置永假匹配条件
      when not matched then
      insert(t.id, t.name, t.year) values(s.aid, s.name, s.year);
      
      

      执行结果如下所示:

      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20
               2 zhangbin             21
               3 fuguo                20
               2 zhangbin             30 -- 新增记录
               4 yihe                 33 -- 新增记录
               3 fuguo        		   -- 新增记录
      
      

      7. 带 delete 的 update

      还原 target 表的数据。删除 target 表中与 source 表匹配的符合指定条件的记录。需要注意的是,delete 子句附属于 update 子句,也就是要有 delete 子句必须有 update 子句。如下语句使用 source 表的记录来匹配更新 target 表中的记录。同时删除匹配的记录中 target 表中 id 为2 的记录,具体实现 sql 如下所示:

      merge into target t using source s on(t.id = s.aid)
      when matched then update set t.year = s.year
      delete where(t.id = 2);
      
      

      执行结果如下所示:

      -- id 为 2 的记录被删除
      SQL> select * from target;
      
              ID NAME               YEAR
      ---------- ------------ ----------
               1 liuwei               20 -- 原有记录
               3 fuguo                   -- year 被更新
      
      
      展开全文
    • Merge into的使用详解

      2016-07-13 14:27:35
      Merge into写法,含两种,带实例说明
    • Merge into用法总结

      2020-07-16 17:58:51
      所以就有了Merge into(Oracle 9i引入的功能)语法 merge into 目标表 a using 源表 b on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……) when matched then update set a.更新字段=b.字段 when not ...

      简单的说就是,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据。  

      有一个表T,有两个字段a、b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在T中插入一条记录。在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);
      但是很明显这个语法对于SQL只能更改一条语句,并且Oracle不能使用.所以就有了Merge into(Oracle 9i引入的功能)语法 

      merge into 目标表 a
       
      using 源表 b
       
      on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……)  
       
      when matched then update set a.更新字段=b.字段
       
      when  not matched then insert into a(字段1,字段2……)values(值1,值2……)
       

        "在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中"源表"的记录数"。

       源表b可能是一张表结构不同于a的表,有可能是一张构建相同表结构的临时表,也有可能是我们自己组起来的数据.

      对于前两种很好理解。现在主要说一下组件数据。

      对于Oracle有dual这个系统表很好构建,如下

       

      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);
       在sql server中,不能使用dual这个系统变量来创建表,所以只能换下思路用union all组装数据或使用临时表,另外using中可以使用的还有table表,view视图,sub_query,子查询

      USING (
      SELECT  '1001'C1,2 C2 
      union all
      SELECT  '1002'C1,3 C2 
      union all...
      ) T2 
      工作中的一个实例

              public Message Saves(List<GoodsQuestionManageModel> models)
              {
                  Message msg;
                  StringBuilder sbSourceSql = new StringBuilder();
                  if (models.Count > 0)//循环组织sql语句
                  {
                      int i = 1;
                      foreach (GoodsQuestionManageModel model in models)
                      {
                          sbSourceSql.AppendFormat("select {0} GoodsQuestionManageId,{1} GoodsId,'{2}' OrderNumber,'{3}' Sku,{4} GoodsQuantity,{5} QuestionQuantity,{6} GoodsQuestionTypeId,'{7}' Remarks,{8} CreateUserId,'{9}' CreateTime,{10} LastUpdateUserId,'{11}' LastUpdateTime,{12} IsDelete \r\n",
                              model.GoodsQuestionManageId, model.GoodsId, model.OrderNumber, model.Sku, model.GoodsQuantity, model.QuestionQuantity, model.GoodsQuestionTypeId, model.Remarks, GlobalModel.Instance.UserId, DateTime.Now, GlobalModel.Instance.UserId, DateTime.Now, model.IsDelete);
                          if (models.Count > i++)
                          {
                              sbSourceSql.AppendLine(" union all");
                          }
                      }
       
                      string strSql = string.Format(@"merge into tb_e_GoodsQuestionManage t
                                                          using
                                                          (
                                                         {0}
                                                          )tSource
                                                          on (t.GoodsQuestionManageId=tSource.GoodsQuestionManageId)
                                                          when not matched then 
                                                          insert values
                                                          (
                                                           tSource.GoodsId, tSource.OrderNumber, tSource.Sku, tSource.GoodsQuantity, tSource.QuestionQuantity, tSource.GoodsQuestionTypeId, tSource.Remarks, tSource.CreateUserId, tSource.CreateTime, tSource.LastUpdateUserId, tSource.LastUpdateTime, tSource.IsDelete
                                                          )
                                                          when matched then 
                                                          update set 
                                                          t.GoodsId=tSource.GoodsId,t.OrderNumber=tSource.OrderNumber,t.Sku=tSource.Sku,t.GoodsQuantity=tSource.GoodsQuantity,t.QuestionQuantity=tSource.QuestionQuantity,
                                                          t.GoodsQuestionTypeId=tSource.GoodsQuestionTypeId,t.Remarks=tSource.Remarks,t.LastUpdateUserId=tSource.LastUpdateUserId,t.LastUpdateTime=tSource.LastUpdateTime,t.IsDelete=tSource.IsDelete;", sbSourceSql.ToString());
                      int effectNum = SqlHelper.ExecuteNonQuery(strSql);
                      if (effectNum > 0)
                      {
                          msg = new Message(true, "保存成功!");
                      }
                      else
                      {
                          msg = new Message(false, "保存失败!");
                      }
                  }
                  else
                  {
                      msg = new Message(false, "没有数据,无需保存!");
                  }
                  return msg;
              }

      Merge 的其他功能

       Merge语句还有一个强大的功能是通过OUTPUT子句,可以将刚刚做过变动的数据进行输出。我们在上面的Merge语句后加入OUTPUT子句

         

         此时Merge操作完成后,将所变动的语句进行输出

         

         

         当然了,上面的Merge关键字后面使用了多个WHEN…THEN语句,而这个语句是可选的.也可以仅仅新增或是仅仅删除

         

       

         

         我们还可以使用TOP关键字限制目标表被操作的行,如图8所示。在图2的语句基础上加上了TOP关键字,我们看到只有两行被更新。

         

         

          但仅仅是MATCHED这种限制条件往往不能满足实际需求,我们可以在图7那个语句的基础上加上AND附加上额外的限制条件

          

       

       

      merge into  效率很高,强烈建议使用,尤其是在一次性提交事务中,可以先建一个临时表,更新完后,清空数据,这样update锁表的几率很小了。


      ————————————————
      版权声明:本文为CSDN博主「Nemo_XP」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/spw55381155/article/details/79891305

      展开全文
    • 2)merge into实现 MERGE INTO t1 USING t2 ON t1.id-t2.id WHEN MATCHED Then UpDate set t1.sale=t2.sale When Not Matched When Not Matched then insert values(t2.id,t2.name,t2.sale,sysdate); --Merge的最后...
    • Merge into的使用 之 Where 条件

      万次阅读 2019-10-08 16:26:14
      Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据...
    • merge into的用法

      2020-07-10 15:58:03
      merge into t1 using t2 on t1.yhangh=t2.yhangh when matched then update set t1.ygongh_now=t2.ygongh,t1.bilifc_now=t2.bilifc when not matched then insert (yhangh,ygongh_now,bilifc_now) values(t2.yhangh,...
    • idea中的merge into curent

      千次阅读 2021-01-05 14:29:34
      最近碰到一系列问题,正好求知所问深入学习了下git 内部原理,东西比较多,先从git merge 说起,因为merge是所有版本控制系统中最最核心之一,本文通过讨论是2个commit 之间的合并 类似git merge C1 C2 ,更多的 git...
    • 在plsql中第一次执行merge into,插入的数据没问题,也没报错, 执行后再点一次执行,数据居然变多了,在源数据没变的情况下,请问我代码的问题吗? 下面是SQL:...
    • merge into 缺失using关键字 今天在做项目的时候,使用merge into总是报错缺失using关键字,可是我SQL里面明明就写了using关键字,找了半天错误,发现了两个常见错误,在此记录一下。 修改前错误代码 merge into ...
    • MERGE INTO

      2019-07-17 14:16:14
      参考资料:http://www.oracle-developer.net/content/utilities/merge_counter.sql 文档:Oracle Database SQL Reference, 10g Release 2 (10.2)...Oracle MERGE INTO的用法总结: Use the MERGE statement to selec...
    • mysql实现merge into的方法

      千次阅读 2021-04-09 17:58:54
      mysql实现merge into的方法 merge into语法 merge语法: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...) WHEN MATCHED THEN [UPDATE sql] WHEN NOT ...
    • Oracle merge into 基于大数据量的优化方向 针对Oracle数据库的更新操作我们会使用 update tableName set col1=col2 where condition... 这样子的事务提交效率比较低下,所以大部分情况下需要批量更新的话我们会...
    • 遇到现象: 该PLSQL块服务运行正常,但表S_VipShopStock的主建出现严重跳号,运行第一次max(id)为600,下一次执行id为1200,经过...merge into mbs7_oms.XS_VipShopStock a using (Select c.stylecode, c.warecode, ...
    • oracle中merge into using 的用法解析

      千次阅读 2019-06-27 15:40:46
      merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)WHEN MATCHED THEN [UPDATE sql]WHEN NOT MATCHED THEN...
    • 求大神帮帮忙!
    • Oracle merge into插入和修改数据 目录 语法: Mybatis: 单个插入: 多个插入: 总结: 在使用oracle数据库,需要操作数据,增加和删除。使用merge into 的语法可以一个语句搞定。 语法: MERGE ...
    • merge into curren 的作用是:合并到当前分支(将所选分支合并到当前分支)。 命令的位置: 1.idea的右下角 点击当前分支可以看到全部的分支列表 选择要合并的分支,点击右侧小三角,就会在菜单列表里看到 ...
    • Merge Into 快速更新大量数据

      千次阅读 2020-12-12 18:14:43
      2、Merge Into Merge into 是 Oracle 9i 引入的功能,其语法如下: MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_...
    • 一直使用merge into语句,但常见的都是update和Insert,那merge into是否支持delete操作呢? 答案是支持,以Oracle数据库scott用户emp表为例 create table emp2 as select * from emp; update emp2 a set a.sal = 1; ...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 77,555
    精华内容 31,022
    关键字:

    mergeinto