119  
查询码: 00000121
Merge into语句用法及其效率问题
来源:http://www.mamicode.com/info-detail-213785.html
作者: 周杨 于 2020年12月10日 发布在分类 / 计算机应用 / 数据库 ,于 2021年07月20日 编辑
insert 语句 数据 问题 效率 select update result 存在 yingyu




/*Merge into 详细介绍
MERGE语句用来合并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;
*/

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 values(值1,值2……)

例子:表test1bubuko.com,布布扣 表score1bubuko.com,布布扣

表score2bubuko.com,布布扣 表score3

将各表中的语文、数学、英语成绩数据取出插入到表1
MERGE INTO test1 R
USING (
select distinct a.name,a.yuwen as yuwen ,b.shuxue as shuxue , c.yingyu as yingyu from score1 a,score2 b,score3 c where a.name = b.name and b.name = c.name
) AS S
ON R.name = S.name
WHEN MATCHED THEN update set R.yuwen = S.yuwen ,R.shuxue = S.shuxue ,R.yingyu = S.yingyu
WHEN NOT MATCHED THEN insert values(S.name,S.yuwen ,S.shuxue ,S.yingyu);
执行上述语句后结果:bubuko.com,布布扣

可以看到,当张三的记录存在时,张三的成绩被更新了,表中不存在李四的记录,所以插入了李四的记录。

由于MERGE INTO 每次操作前都判断记录是否存在(存在则更新,不存在则插入),所以效率会比较低。
由于表关联的复杂性,向上表三列的数据可能要megre三次数据,这时可以先用一张表直接插入数据

insert into sessino.result (id,a)select id ,a from ...

insert into sessino.result (id,b) select id ,b from ...

insert into sessino.result (id,c)select id ,c from ...

然后再用同样 结构的一张表处理数据insert into sessino.result1select id sum(a),sum(b),sum(c) from sessino.result   group by id;



 历史版本

备注 修改日期 修改人
其他原因...增加示例 2021-07-20 16:12:29[当前版本] 系统管理员
CREAT 2020-12-10 11:28:25 系统管理员

 附件

附件类型

JPGJPG

知识分享平台 -V 5.1.4 -大信谛威