zoukankan      html  css  js  c++  java
  • MS SQL 技巧总结--持续更新

    使用Merge关键字做插入或更新操作

    Merge关键字可以进行2个表之间的更新。

    应用场景

    1. 批量插入或更新数据;
    2. 经销存更新库存
    3. 表之间数据的复制

    等等

    语法说明

    MERGE 目标表
    
    USING 源表
    
    ON 匹配条件
    
    WHEN MATCHED THEN
    
      语句
    
    WHEN NOT MATCHED THEN
    
      语句;
    

    说明:

    • 最末尾一定要有;代表语句结束

    • Merge 源表可以是表也可以是子查询语句

    • 目标表只能是一个表

    • When not matched by target(简化为When not matched ),这个子句处理存在于数据源之中,但不存在目标之中的数据行。

    • When not mathed by source,这个子句处理,存在于目标中,但是不存在数据表之中的数据行

    • 如果有两个 when matched,则必须使用and来限定第一个子句,一个子句必须制定一个update,另一个必须制定delete

    应用举例

    批量插入或更新数据

    
    --有2张表test1 和test1,将test1的数据插入到test2,当id存在则更新,不存在则插入
    create table test1 (id int,name varchar(100),total int)
    create table test2 (id int,name varchar(100),total int)
     
    insert into test1
    values(1,'wang',3),(2,'trieagle',5)
    insert into test2
    values(1,'li',7)
    
    merge test2 
    using test1 
    on test1.id=test2.id
    when matched then update set name=test2.name,total = test1.total
    when not matched by target then insert values(test1.id,test1.name,test1.total);
    select * from test2;
    

    test2表的结果:

    1 li 3
    2 trieagle 5

    综合使用多个 when matched和when not matched

    delete from test1;
    delete from test2;
    insert into test1 values(1,'wang',-3),(2,'trieagle',5),(3,'huang',6),(4,'yuan',8)
    
    insert into test2 values (1,'wang',3),(2,'trieagle',1),(5,'huang',5)
    ---使用merge
    merge test2 as t2
    using test1  as t1
    on t1.id=t2.id  and t1.name = t2.name
    when matched and (t2.total+t1.total =0) then delete 
    when matched then update set total=t1.total +t1.total
    --处理存在于数据源(test2)之中,但不存在目标(test1)之中的数据行。
    when not matched  then insert values(t1.id,t1.name,t1.total)
    --处理,存在于目标(test1)中,但是不存在数据源表之中的数据行
    when not matched by source then delete;
    
    select * from test1;
    结果:
    1	wang	-3
    2	trieagle	5
    3	huang	6
    4	yuan	8
    select * from test2;
    结果:
    2	trieagle	10
    3	huang	6
    4	yuan	8
    
  • 相关阅读:
    常用的SQL语句
    解决Pycharm中module 'pip' has no attribute 'main'的问题
    [转]如何使用Fiddler抓取指定浏览器的数据包
    Linux常用命令
    Android:JACK编译错误汇总及解决
    Linux学习:使用 procrank 测量系统内存使用情况
    Android:动态库(.so)调试技巧
    Android 显示系统:Vsync机制
    Android:cmake开发指南
    Android:高通平台性能调试
  • 原文地址:https://www.cnblogs.com/wanxiangIT/p/13276897.html
Copyright © 2011-2022 走看看