从备份表中更新字段到正式表中,使用 UPDATE 批量更新大量的数据,会出现效率低下,有时候甚至卡死的情况,后面通过使用 MERGE INTO 代替 UPDATE 执行批量更新,会提升执行效率。
MERGE INTO语法如下:
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指的是连接条件,如果满足连接条件,set 字段1=值1,字段2=值2...
如果连接条件不满足,则停止更新进行插入。
下面我们来举例说明:
先创建被更新表merge_target,并往其中插入一条数据用来更新;
MERGE INTO merge_target target
USING (SELECT B.name,B.age,B.target_id FROM merge_source B) source
ON (target.id=source.target_id)
WHEN MATCHED THEN
UPDATE
SET target.name = source.name,
target.age = source.age
WHEN NOT MATCHED THEN
INSERT(target.name,target.age) VALUES (source.name,source.age);
结果如下:
SQL
Server高级开发(
Merge
Into
的使用)
我们先创建一张临时表 #TempTable包含三列:学生姓名,科目名称和成绩,建表语句如下:
Create Table #TempTable
StudentName nvarchar(20) Not Null,
SubjectName nvarchar(20) Not Null,
Score int null
其中学生姓名和科目名称是不能重复的,那么我们在插入数据时就会先检测数据是否存在,不存在就写入,存在就更新
在批量更新大量的数据时,使用Insert 和Update操作会出现效率低下,甚至卡死的情况。改用
MERGE
INTO
代替执行批量更新,会提升执行效率。
merge
into
将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),好处是避免了多个insert 和update操作。
merge
into
是一个目标性明确的操作符,不允许在一个
merge
语句中对相同的行insert或update操作。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于insert+u
从备份表中更新字段到正式表中,使用 UPDATE 批量更新大量的数据,会出现效率低下,有时候甚至卡死的情况,后面通过使用
MERGE
INTO
代替 UPDATE 执行批量更新,会提升执行效率。
MERGE
INTO
语法如下:
[ TOP ( expression ) [ PERCENT ] ]
[
INTO
] <操作表> --即将做插入、更新、删除的表
USING <源表或者数据集或者子查询> --用户提供匹配条件来源的集合或者表
ON <匹配条件> --可...
多表关联查询的时候会用到临时表插入数据,然后再用select查行查询,在往临时表里插入数据的时候,我们经常会用到判断如果临时表里有了这部分数据我们就要更新数据,如果临时表里没有这部分数据我们就要插入,这个时候可以怎么去实现呢?
下面介绍各类型数据库实现的大致方式。
一、存储过程实现
各类型数据库都可以通过存储过程实现,因为是共性问题,所以就放前面了,这里以my
sql
数据库的存储过程为例。
1、环境准备
create table t1(
id bigint(10),
name varcha
判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据。
MERGE
INTO
目标表 a --需要处理的表
USING 源表 b --需要判断数据是否存在的表
ON (a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2)
WHEN MATCHED --当关联条件成立时 更新 后可以接AND条件 如and 1=1
THEN update set a.更新字段=b.字段
WHEN NOT MATCHED --当关联条