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;