zoukankan      html  css  js  c++  java
  • MERGE INTO

    USE tempdb;
    GO
    IF OBJECT_ID('SourceTable') IS NOT NULL
        DROP TABLE SourceTable;
    IF OBJECT_ID('TargetTable') IS NOT NULL
        DROP TABLE TargetTable;
    
    --
    CREATE TABLE SourceTable
    (
        id INT,
        name VARCHAR(2),
        [desc] NVARCHAR(50)
    );
    --目标
    CREATE TABLE TargetTable
    (
        id INT,
        name VARCHAR(2),
        [desc] NVARCHAR(50)
    );
    
    --源表数据
    INSERT INTO SourceTable
    VALUES
    (1, 'a', '描述1'),
    (2, 'a', '描述2'),
    (3, 'a', '描述3'),
    (4, 'a', '描述4');
    
    --目标表数据
    INSERT INTO TargetTable
    VALUES
    (1, 'a', '在源表里存在,将会被更新');
    INSERT INTO TargetTable
    VALUES
    (2, 'a', '在源表里存在,将会被更新');
    INSERT INTO TargetTable
    VALUES
    (5, 'a', '在源表里不存在,将会被删除');
    INSERT INTO TargetTable
    VALUES
    (6, 'b', '在源表里不存在,但是条件不符合,不删除');
    
    SELECT *
    FROM SourceTable AS st;
    /*
    id name    desc
    1    a 描述1
    2    a 描述2
    3    a 描述3
    4    a 描述4
    */
    
    SELECT *
    FROM TargetTable AS tt;
    /*
    id    name desc
    1    a 在源表里存在,将会被更新
    2    a 在源表里存在,将会被更新
    5    a 在源表里不存在,将会被删除
    6    b 在源表里不存在,但是条件不符合,不删除
    */
    
    --注意事项 
    --1.最后的分号必须有
    --2.源表可以是一个具体的表,也可以是一个子查询语句
    --3.2008或以上版本才有的功能
    
    MERGE INTO TargetTable AS T --可添加 TOP 限制操作行数: MERGE TOP(2)
    USING SourceTable AS S
    ON T.id = S.id
       AND T.name = 'a'
       AND S.name = 'a'
    WHEN MATCHED --当两者的id能匹配,id=1,2的数据被更新
    THEN    UPDATE SET T.[desc] = S.[desc]
    WHEN NOT MATCHED --目标表没有的ID, 在原表中有,则插入相关的数据
    THEN    INSERT (id,name) VALUES (S.id, S.name)
    WHEN NOT MATCHED BY SOURCE  AND t.name = 'a' --目标表中存在,源表不存在,则删除
    THEN    DELETE
    OUTPUT $ACTION AS [Action],
           INSERTED.id AS [插入的id],
           Inserted.name AS [插入的name],
           INSERTED.[desc] AS [插入的DESC],
           DELETED.id AS [删除的id],
           DELETED.name AS [删除的name],
           DELETED.[desc] AS [删除的DESC];
    
    
    
    
    SELECT *
    FROM SourceTable AS st;
    
    
    SELECT *
    FROM TargetTable AS tt;
  • 相关阅读:
    ACwing98 分形之城 分形图
    ACwing96 奇怪的汉诺塔 递推
    ACwing95 费解的开关 bfs
    ACwing94 递归实现排列型枚举 dfs
    ACwing93 递归实现组合型枚举 dfs
    递归型枚举总结
    洛谷P2286 宠物收养场 splay
    python之路——初识数据库
    python之路——协程
    python之路——线程
  • 原文地址:https://www.cnblogs.com/BinBinGo/p/10576575.html
Copyright © 2011-2022 走看看