Sqlserver merge(Transact-SQL)用法

官方文档解释:
   根据与源表联接的结果,对目标表运行插入、更新或删除操作。
  例如:根据与另一个表的区别,在一个表中插入、更新或删除行,从而同步两个表

性能提示:
  当两个表具有匹配特性的复杂混合时,针对merge语介绍的条件行为的效果最佳。
  例如,插入不存在的行,或更新匹配的行。
  仅根据另一个表的行更新一个表时,通过基本的INSERT、UPDATE、DELETE语句提升性能和可伸缩性。

用法以下代码为例:

merge NovoNordisk_DW.dbo.Fact_EXNNSales_StockDay stock 
        using #tempTable temp
        on stock.[LB_Version]= temp.[LB_Version]
        and stock.[LB_Product]=temp.LB_Product and stock.[LB_Year]=temp.[LB_Year] and stock.[LB_Month]=temp.[LB_Month]
        when matched 
                    then update set
                    stock.[LB_StockDay]=temp.LB_StockDay
        WHEN NOT MATCHED BY TARGET 
                    then insert
                          values(
                          temp.[LB_Version]
                          ,temp.[LB_Product]
                          ,temp.[LB_Year]
                          ,temp.[LB_Month]
                          ,temp.[LB_StockDay]
                          ,temp.[StatsDate]
                          ,temp.[UpdatedDate]
                            )
        when not matched by source
                    then delete;

关键字剖析:

merge 目标表表名 t1             --将数据最终merge到目标表
using 源表表名 t2                  --目标表与源表联接
on t1.xx=t2.xx and t1.aa=t2.aa          --关联匹配的条件
when matched                 --如果关联匹配的条件匹配成功
  then update set t1.字段=t2.字段      --将源表中的其他字段更新至目标表
when not matched by target           --如果匹配不成功(target目标表没有这条记录,source源表中有,即source中数据应插入到target目标表)
  then insert values(t2.字段1,t2.字段2)    --将源表中字段插入到目标表
when not matched by source         --如果匹配不成功(source源表没有这条记录,target目标表中有,即根据具体需求去决定是否删除)
  then delete;                --删除目标表中存在,源表中不存在的数据

Sqlserver merge(Transact-SQL)用法

上一篇:MySQL 删除表的三种方式


下一篇:linux连接mysql命令