zoukankan      html  css  js  c++  java
  • sqlserver merge用法

    Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。

    主要用法:
    merge无法多次更新同一行,也无法更新和删除同一行
    当源表和目标表不匹配时:
    若数据是源表有目标表没有,则进行插入操作
    若数据是源表没有而目标表有,则进行更新或者删除数据操作
    当源表和目标表匹配时:
    进行更新操作或者删除操作

    语法格式:

    MERGE 目标表

    USING 源表

    ON 匹配条件

    WHEN MATCHED THEN

    语句

    WHEN NOT MATCHED THEN

    语句;

    其中最后语句分号不可以省略,且源表既可以是一个表也可以是一个子查询语句

    WHEN NOT MATCHED BY TARGET

    表示目标表不匹配,BY TARGET是默认的,所以上面我们直接使用WHEN NOT MATCHED THEN

    WHEN NOT MATCHED BY SOURCE

    表示源表不匹配,即目标表中存在,源表中不存在的情况。

    注意事项:

    Merge 语句最后必须包含分号,以 ; 结束。

    使用场景:

    平时我们在项目中时常会碰到需要定期同步的问题,比如组织架构、人员信息、物品信息等等。

    实战举例:

    此时我有一个用户表kb_People,有一个用户表2  kb_People2。你可以把它想象成不同库的用户表。

    需求:kb_People表需要每天定时去更新数据,如:新增、修改、删除用户操作。依据来源就是kb_People2,如图

    实现:

    merge [KBDB].[dbo].[kb_People] as a --目标表
    using [KBDB].[dbo].[kb_People2] as b --源表
    on a.ID=b.ID    --关联关系
    when MATCHED then    --如果ID相匹配
    update set a.name=b.name,a.username=b.username,a.password=b.password,a.peotypeid=b.peotypeid   --修改
    WHEN NOT MATCHED THEN    --如果ID匹配不上
    insert (id,name,username,password,peotypeid) values (b.id,b.name,b.username,b.password,b.peotypeid);  --新增

    结果展示:

    最后拿语句再去跑个作用定期执行就搞定了。

    参考网址:

    https://www.jb51.net/article/75302.htm

    https://www.cnblogs.com/zfy-220/p/4977802.html

  • 相关阅读:
    通用XML读写和配置(二)
    C++多态中的VPTR
    如何查看Linux操作系统的位数?
    另类获取ORACLE导入导出(imp/exp)数据的进度信息
    成熟是明亮而不刺眼的光辉
    C/C++预处理运算符
    系统设计与规划一点总结
    Linux 任务计划之crontab命令
    linux挂载磁盘阵列
    Linux下JDK的中文显示
  • 原文地址:https://www.cnblogs.com/JoeYD/p/15165333.html
Copyright © 2011-2022 走看看