使用MERGE语句同步表



先建好测试环境:

 

USE TEMPDB
GO
IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1
IF OBJECT_ID('T2') IS NOT NULL DROP TABLE T2
GO
CREATE TABLE T1(ID1 INT,VAL1 VARCHAR(50))
CREATE TABLE T2(ID2 INT,VAL2 VARCHAR(50))
GO
INSERT INTO T1
SELECT 1,'A' UNION ALL
SELECT 2,'B' UNION ALL
SELECT 3,'C'

 

现在我们的目标是让T2表与T1表同步,我直接把完整的MERGE语句帖上来,等下再细说各个部分:

MERGE INTO T2 AS TB_TARGET
USING T1 AS TB_SOURCE
ON TB_TARGET.ID2=TB_SOURCE.ID1
WHEN NOT MATCHED BY TARGET THEN 
INSERT(ID2,VAL2)
VALUES(ID1,VAL1)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN 
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2
;

看看MERGE语句输出的结果

/*

$ACTION    ID2         VAL2                                               VAL2
---------- ----------- -------------------------------------------------- --------------------------------------------------
INSERT     1           NULL                                               A
INSERT     2           NULL                                               B
INSERT     3           NULL                                               C

*/

再看一下现在T2的内容:

 

SELECT * FROM T2

/*

ID2         VAL2
------
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 将student中的数据同步到newstudent中: ```sql MERGE INTO newstudent ns USING student s ON (ns.id = s.id) WHEN MATCHED THEN UPDATE SET ns.name = s.name, ns.age = s.age, ns.gender = s.gender, ns.birthday = s.birthday WHEN NOT MATCHED THEN INSERT (ns.id, ns.name, ns.age, ns.gender, ns.birthday) VALUES (s.id, s.name, s.age, s.gender, s.birthday); ``` 2. 在student中插入一行数据,再同步到newstudent: ```sql INSERT INTO student (id, name, age, gender, birthday) VALUES (6, 'Tom', 20, 'Male', '2000-01-01'); MERGE INTO newstudent ns USING (SELECT id, name, age, gender, birthday FROM student WHERE id = 6) s ON (ns.id = s.id) WHEN MATCHED THEN UPDATE SET ns.name = s.name, ns.age = s.age, ns.gender = s.gender, ns.birthday = s.birthday WHEN NOT MATCHED THEN INSERT (ns.id, ns.name, ns.age, ns.gender, ns.birthday) VALUES (s.id, s.name, s.age, s.gender, s.birthday); ``` 3. 更改新插入同学的出生日期后再同步到newstudent: ```sql UPDATE student SET birthday = '2000-02-01' WHERE id = 6; MERGE INTO newstudent ns USING (SELECT id, name, age, gender, birthday FROM student WHERE id = 6) s ON (ns.id = s.id) WHEN MATCHED THEN UPDATE SET ns.name = s.name, ns.age = s.age, ns.gender = s.gender, ns.birthday = s.birthday WHEN NOT MATCHED THEN INSERT (ns.id, ns.name, ns.age, ns.gender, ns.birthday) VALUES (s.id, s.name, s.age, s.gender, s.birthday); ``` 4. 删除新学生记录后同步到newstudent: ```sql DELETE FROM student WHERE id = 6; DELETE FROM newstudent WHERE id = 6; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值