merge源表数据移植到目标表新表数据中

merge into dbo.ak_SloteCardTimes a using(select RecordID,CardNO,SloteCardTime from dbo.Tb_CardDate b ) c on(a.RecordID=c.RecordID)
when matched then update set a.CardNO=c.CardNO ,a.SloteCardTime=c.SloteCardTime
when not matched  then insert(RecordID,CardNO,SloteCardTime)
values(c.RecordID,c.CardNO,c.SloteCardTime);

知识温故和梳理引用:

创建表一为源表:

CREATE TABLE Product   
(   
    ProductID    varchar(7) NOT NULL PRIMARY KEY,   
    ProductName varchar(100) NOT NULL,   
    Price        decimal(13,2) DEFAULT 0   
);  

INSERT INTO Product   
    Values   
    ('4100030','iPhone5c',5500),   
    ('4100031','iPhone4',3200),
    ('4100037','iPhone5s',5500),   
    ('4100038','iPhone4s',3200);

 目标表:

 CREATE TABLE ProductNew   
    (   
        ProductID    varchar(7) NOT NULL PRIMARY KEY,   
        ProductName varchar(100) NOT NULL,   
        Price        decimal(13,2) DEFAULT 0   
    );  

 

--MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入、更新或删除操作。最典型的应用就是进行两个表的同步
	--显然Product与ProductNew表的MERGE匹配条件为主键ProductID字段,初始情况下,ProductNew表为空,此时肯定执行的是WHEN NOT MATCHED THEN后的语句,我们先只考虑源表递增的情况,MERGE语句如下:
   MERGE ProductNew AS d   
   USING    Product   AS s   
   ON s.ProductID = d.ProductId   
   WHEN NOT MATCHED THEN   
   INSERT( ProductID,ProductName,Price)   
   VALUES(s.ProductID,s.ProductName,s.Price);
  
    --现在,我们更新Product表4100030产品的价格,将其修改为9500:
    --我们也希望每天同步的时候应该将更新后的价格同步到ProductNew表,显然此时在MERGE语句中应该添加WHEN MATCHED THEN 语句,该语句来更新ProductNew表的价格,添加匹配更新后的MERGE语句:
    MERGE ProductNew AS d   --目标表
    USING   Product    AS s           --源表 
    ON s.ProductID = d.ProductId    --匹配条件
    WHEN NOT MATCHED THEN   
    INSERT( ProductID,ProductName,Price)   
    VALUES(s.ProductID,s.ProductName,s.Price)
    WHEN MATCHED THEN   
    UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
   -- 我们的UPDATE语句里面没有更新ProductID字段,因为这是完全没必要的(如果修改了ProductID字段会直接走到NOT MATCHED)。
--假如我么会把源表删除一条数据 即源表存在三条数据而 目标表有四条数据 -- WHEN NOT MATCHED BY TARGET 表示目标表不匹配,BY TARGET是默认的 --WHEN NOT MATCHED BY SOURCE 表示源表不匹配,即目标表中存在,源表中不存在的情况。现在我们要完成源表DELETE后,目标表的同步动作,MERGE语句如下: MERGE ProductNew AS d USING Product AS s ON s.ProductID = d.ProductId WHEN NOT MATCHED BY TARGET --表示目标表不匹配,BY TARGET是默认的 THEN INSERT( ProductID,ProductName,Price) VALUES(s.ProductID,s.ProductName,s.Price) WHEN NOT MATCHED BY SOURCE --表示源表不匹配,即目标表中存在,源表中不存在 THEN DELETE WHEN MATCHED THEN UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;

 

 

 

posted @ 2014-04-01 14:48  蜜雪粮液  阅读(905)  评论(0编辑  收藏  举报