标签归档:merge

mssql sqlserver 采用merge关键字实现增删改的方法分享


摘要:
下文讲述采用merge关键字实现,联结(左连接 右连接)中的增(insert) 删(delete) 改(update)的操作方法


--目标表A  
CREATE TABLE TargetA(keyId INT,[info] VARCHAR(50))  
--数据源B  
CREATE TABLE SourceB(keyId INT,[info] VARCHAR(50))  
--目标表A 
INSERT INTO TargetA VALUES (1,'可关联数据'),(2,'可关联数据'),
(5,'无法关联数据')  ,(6,'无法关联数据')   
--数据源B
INSERT INTO SourceB VALUES (1,'test_1'),(2,'test_2'),(3,'test_3'),(4,'test_4')  
 
--注意事项   
---数据库源可以是一个子查询、视图、函数等能返回集合的sql脚本
---merge关键字结尾必须使用分号
---merge中insert update delete 都只能对target表,进行操作

MERGE INTO TargetA AS a     --此处可采用 merge top (10) 限制操作的行数   
USING SourceB AS b          --关联的源数据
ON a.keyId=b.keyId  
WHEN MATCHED            --当两者的keyId匹配成功,执行targetA的更新操作,这类类似内连接  
    THEN UPDATE SET a.[info] = b.[info] 
WHEN NOT MATCHED        --keyId匹配不成功 类似左连接 when not matched 等同于 when not matched by target 
    THEN INSERT VALUES(b.keyid,b.[info])    ---执行插入操作
WHEN NOT MATCHED BY SOURCE --target表中存在,source表中不存在 类似于 a right join b的右连接的方式 
    THEN DELETE      ---删除target表中的数据
OUTPUT $ACTION AS [操作方式]  
    ,INSERTED.keyId AS [插入keyId]  
    ,INSERTED.[info] AS [插入info]  
    ,DELETED.keyId AS [删除keyId]  
    ,DELETED.[info] AS [删除info]  
;  
  
SELECT * FROM SourceB AS st  
SELECT * FROM TargetA AS tt  
go
drop table TargetA
drop table SourceB
go
mssql_sqlserver_merge_insert_update_delete应用

mssql_sqlserver_merge_insert_update_delete应用

mssql sqlserver之merge关键字(插入 更新)应用于说明


摘要:
sqlserver 2008,系统开始提供一个新的关键字merge,在merge关键字中,我们可以进行插入 更新 删除操作。
在merge关键字中,你可以将数据源同目标表进行关联,然后对关联结果集做相关的判断,执行相关的操作。



merge关键字功能说明:
根据连接匹配条件对目标表,进行插入、更新、删除操作。
merge关键字说明:
MERGE [目标表] AS target —指定目标表
using:指定数据源
on :指定目标表和数据源之间的关联字段
when:操作条件子句(WHEN MATCHED、WHEN NOT MATCHED BY 目标表 和 WHEN NOT MATCHED BY 源表)
output:output关键字返回insert update delete merge关键字的操作信息
merge关键字结尾,需使用分号

例:
有表A和表B,
需将表B的数据中的name列,根据keyId关联,全部更新至表A,
如果B表中keyId不存在A中,则将表B的数据插入至表A中,
A表中 特定记录不参与此操作
以上的两种操作在sqlserver2008中,我们可以采用一条sql语句进行操作完成
如下所示:

   create table A(keyId int,name varchar(30),qty int)
create table B(keyId int,name varchar(30))
go
insert into A(keyId,name,qty)values
(1,'test',5),(2,'test2',6),(3,'test3',58),(888,'禁止操作',500)

insert into B(keyId,name)values
(1,'maomao365.com'),(2,'猫猫小屋'),(6,'测试插入')
go

 merge A as targetTb 
 using B as sourceTb
 on(targetTb.keyId = sourceTb.keyId)
 when matched and targetTb.name !='禁止操作'  
 then update set  targetTb.name = sourceTb.name
 when not matched and sourceTb.name  is not null 
 then insert(keyId,name,qty)values(sourceTb.keyId,sourceTb.name,0)
 
 output $action,inserted.*,deleted.* ;
  
 go
 select * from A 


go
drop table A
drop table B
  

mssql_merge关键字insert_update用法

mssql_merge关键字insert_update用法



注意事项:
对目标表进行删除和更新操作,必须是目标表和源数据表进行内连接关联后的数据才可以进行相关操作
when not matched by [目标表] -类似于 目标表和源表左连接 –缺省值为 by [目标表]
when not matched by [源表] -类似于 目标表和源表右连接
when matched 才可以进行 update delete操作(因为数据未匹配成功,无法进行删除和更新操作)

sqlserver merge关键字应用简介-替换insert_update


摘要:
merge关键字用于合并insert和update操作,
通过使用merge关键字,我们可以同时对源表进行修改和新增操作。
常见的应用场景:
根据不同的条件匹配两张表,如果不存在,则插入,否则更新
merge关键字的效率高于update和insert关键字
———————————————–
实验环境:
sql server 2008 R2


例:使用merge 替代insert update 关联写法

create table test(keyId int,info varchar(30))
go
insert into test(keyId,info)values
(1,'猫猫小屋'),(2,'maomao365.com')
go

/*sql server原始写法*/
update test set info='update data' where keyId=3
if @@rowcount =0
begin
insert into test(keyId,info)values(3,'insertData')
end
go

select * from test 
go

truncate table test 
insert into test(keyId,info)values
(1,'猫猫小屋'),(2,'maomao365.com')
go

---------------merge新写法----------
MERGE test AS target  ---定义目标表
    USING (SELECT '30', 'Data') AS source (keyId, info) ---源数据
    ON (target.keyId = source.keyId) --关联字段
    WHEN MATCHED THEN     ---如果匹配上就更新
        UPDATE SET info = source.info
    WHEN NOT MATCHED THEN    ---如果不匹配就插入
        INSERT (keyId, info)
        VALUES (source.keyId, source.info);
------------------------------------

select * from test 
go 
drop table test