标签归档:merge

MSSQL 插入数据时候,如果存在则更新的方法分享


摘要:
下文讲述MSSQL中,插入数据时,如果存在则更新,否则就插入数据的方法分享
实验环境:sql server 2017


mssql中,我们可以采用 MERGE INTO 关键字实现此功能,
当两者匹配成功,则运行***语句,否则运行其它语句,达到插入数据时的判断操作,
具体操作方法如下所示:

create table [maomao365.com]
(keyId int identity,
info varchar(80)
 )
 go
 insert into [maomao365.com]
(info)values('sqlblog'),
 ('sqlserver'),('maomao365.com') 

---merge into实现如果存在,则更新
---如果不存在,则删除
MERGE INTO [maomao365.com] a
USING (SELECT 2 AS keyId_B, 'other' AS info_B )  b 
ON ( a.keyId = b.keyId_B)

WHEN MATCHED THEN
UPDATE SET a.info= b.info_B  --更新

WHEN NOT MATCHED THEN
INSERT (info) VALUES(b.info_B); ---插入

go
select * from [maomao365.com]
go
MERGE INTO [maomao365.com] a
USING (SELECT 20 AS keyId_B, 'new Info' AS info_B )  b 
ON ( a.keyId = b.keyId_B)

WHEN MATCHED THEN
UPDATE SET a.info= b.info_B  --更新
 
WHEN NOT MATCHED THEN
INSERT (info) VALUES(b.info_B); ---插入
go

select * from [maomao365.com]
go
truncate table [maomao365.com]
drop     table [maomao365.com]

相关阅读:
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操作(因为数据未匹配成功,无法进行删除和更新操作)