加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

使用matched 判定条件,完成原表到目标表的数据转移

发布时间:2020-12-12 16:08:51 所属栏目:MsSql教程 来源:网络整理
导读:同步操作 MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象 USING 与源表连接 ON 关联的条件 WHEN MATCHED - 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中) WHEN NOTMATCHED BY TARGET - 如果匹配不成

同步操作

MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象

USING 与源表连接 ON 关联的条件

WHEN MATCHED - 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中)

WHEN NOTMATCHED BY TARGET - 如果匹配不成功 (TARGET 中没有这一条记录但是 SOURCE 表有,说明 SOURCE 表多了新数据因此应该插入到 TARGET 表中)

WHEN NOTMATCHED BY SOURCE - 如果匹配不成功 (SOURCE 中没有这一条记录但是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,所以 TARGET 也应该删除)

MERGE INTO @TargetTable AS T           
USING @SourceTable AS S ON T.ID = S.ID WHEN MATCHED THEN UPDATE SET T.DSPT = S.DSPT WHEN NOT MATCHED BY TARGET THEN INSERT VALUES(S.ID,S.DSPT) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $ACTION AS [ACTION],Deleted.ID AS 'Deleted ID',Deleted.DSPT AS 'Deleted Description',Inserted.ID AS 'Inserted ID',Inserted.DSPT AS 'Inserted Description' INTO @Log;

还要注意的是有一些限制条件:

  • 在 Merge Matched 操作中,只能允许执行 UPDATE 或者 DELETE 语句。
  • 在 Merge Not Matched 操作中,只允许执行 INSERT 语句。
  • 一个 Merge 语句中出现的 Matched 操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误 -?An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.
  • Merge 语句最后必须包含分号,以 ; 结束。

----------------------------------------------------------------------------------------------------------------------------

例子:

--源表

CREATE?TABLE?test_from?(id?INT,?val?VARCHAR(20));
--?目标表
CREATE?TABLE?test_to?(id?INT,?val?VARCHAR(20));
--?插入源表
INSERT?INTO?test_from?VALUES?(1,?'A');
INSERT?INTO?test_from?VALUES?(2,?'B');
--?合并?源表到目标表

MERGE?test_to?

USING?test_from

ON?(?test_to.id?=?test_from.id?)????--?条件是?id?相同
WHEN?MATCHED?THEN?UPDATE?SET?test_to.val?=?test_from.val???--?匹配的时候,更新
WHEN?NOT?MATCHED?THEN?INSERT?VALUES(test_from.id,?test_from.val)?--?源表有,目标表没有,插入
WHEN?NOT?MATCHED?BY?SOURCE?THEN?DELETE;?--?目标表有,源表没有,目标表该数据删除.


--?第一次检查?目标表数据. SELECT?*?FROM?test_to; ? id??????????val -----------?-------------------- ??????????1?A ??????????2?B --?更新源表 UPDATE?test_from?SET?val?=?'A2'?WHERE?id?=?1; --?删除源表 DELETE?FROM?test_from?WHERE?id?=?2; --?插入源表 INSERT?INTO?test_from?VALUES?(3,?'C'); ? ? --?合并?源表到目标表 MERGE?test_to?USING?test_from ON?(?test_to.id?=?test_from.id?)????--?条件是?id?相同 WHEN?MATCHED?THEN?UPDATE?SET?test_to.val?=?test_from.val???--?匹配的时候,更新 WHEN?NOT?MATCHED?THEN?INSERT?VALUES(test_from.id,?test_from.val)?--?源表有,目标表没有,插入 WHEN?NOT?MATCHED?BY?SOURCE?THEN?DELETE;?--?目标表有,源表没有,目标表该数据删除. ? --?再次检查?目标表数据. SELECT?*?FROM?test_to; ? id??????????val -----------?-------------------- ??????????1?A2 ??????????3?C




(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读