• Sql 2008的merge关键字


    测试数据

    /*目标表和源表*/
    declare @target table(id int, de varchar(50))
    declare @source table(id int, de varchar(50))
    insert into @source values (1,'源1'),(2,'源2'),(3,'源3'),(4,'源4')
    insert into @target values 
    (1,'在源表里面有1'),(2,'在源表里面有2'),(5,'在源表里面没有5'),(6,'在源表里面没有6')
    select * from @target

    image

    代码一

    merge into @target as T
    using @source as S on T.id=S.id
    when matched then update set T.de=S.de
    ;
    select * from @target

    两张表通过id匹配. 如果符合. 则把目标表的de改为源表的de得到数据如image. 红圈两列完成了 更改

    代码二.

    merge into @target as T
    using @source as S on T.id=S.id
    
    when matched        then update set T.de=S.de
    when not matched    then insert values(S.id,S.de)        --如果目标表里面没有源表的数据
    /*when not matched by source
    --                    then delete                            
    --如果target里面有, 但是源表没有的就删除. 有点类似于inner join的笛卡尔乘积, 
    --左边表里面存着记录, 但是右边表没有. 还是删除掉
    */
    output $Action as actiontype,deleted.*,inserted.*
    ;
    select * from @target

    同样是通过id匹配. 如果符合. 那么更新, 不符合那么插入.

    output是输出. $action是表示这次操作的类型. (insert或者update还有delete). 操作类似于触发器. 能够访问到deleted.*表和inserted.*表的东西.

    因此输出

    image  . 目标表的,1,2 从image改成imageimage, 因为3,4在目标表里没有.

    代码三.  去掉代码二的注释. 会得到什么呢? 就是删除掉source里面没有, target里面有的记录.

    image这两条记录在源表里面木有. 所以要删除.

    image执行结果.

    扩展: 如何在Merge之后删除已经Merge过去的数据.

    http://stackoverflow.com/questions/7331725/how-to-delete-from-source-using-merge-command-in-sql-server-2008

    本人在长沙, 有工作可以加我QQ4658276
  • 相关阅读:
    MSN、易趣、大旗被挂马 用户浏览后感染机器狗病毒 狼人:
    世界最大漏洞数据库发布最新研究报告 狼人:
    五角大楼最昂贵武器发展项目遭到黑客攻击 狼人:
    RSA呼吁厂商“创造性协作” 共同反击网络威胁 狼人:
    RSA2009:云计算服务如何保证安全? 狼人:
    黑客工具可将恶意软件隐藏于.Net框架 狼人:
    RSA安全大会将亮相25款热门安全产品 狼人:
    目录访问共享C#怎么访问共享目录
    代码下行Jquery结合Ajax和Web服务使用三层架构实现无刷新分页
    输出次数HDU2192:MagicBuilding
  • 原文地址:https://www.cnblogs.com/jianjialin/p/2413573.html
Copyright © 2020-2023  润新知