为错误匹配值编写MERGE语句

时间:2016-08-15 15:21:15

标签: sql sql-server merge

我有一个表tblstars_new,每周从客户端更新一次。我有另一个表,tblstars,它需要从tblstars_new导入新的和更新的数据。

在tblstars_new中查找tblstars中不存在的行,然后将其添加到tblstars很简单。

但是,我还需要在tblstars_new中找到PandA_Code列已更改的行,然后更新tblstars中的相同行。

此查询告诉我来自tblstars_new的哪些行的PandA_Code已更改并需要在tblstars中更新。

SELECT 
    sn.*
FROM
    tblstars_new sn
    JOIN tblstars s ON sn.Student_ID_Number = s.Student_ID_Number AND sn.PandA_Code != s.PandA_Code

我正在试图找出一个可以进行更改的MERGE语句。正如我在Prod所做的那样,我无法真正玩耍。两个问题:

1)是否可以在不实际进行更改的情况下查看更改?

2)下面的MERGE语句是否正确?

BEGIN TRAN;
MERGE tblstars AS T         -- Target
USING tblstars_new AS S     -- Source
ON 
    (T.Student_ID_Number = S.Student_ID_Number AND T.PandA_Code != S.PandA_Code) 
WHEN NOT MATCHED BY TARGET 
    THEN 
    UPDATE SET T.PandA_Code = S.PandA_Code
OUTPUT $action;
ROLLBACK TRAN;
GO 

2 个答案:

答案 0 :(得分:2)

以下是满足您请求的MERGE查询。

BEGIN TRAN;
MERGE tblstars AS T         -- Target
USING tblstars_new AS S     -- Source
ON T.Student_ID_Number = S.Student_ID_Number -- They shoudl match by PK
WHEN MATCHED AND  AND T.PandA_Code != S.PandA_Code
    THEN                    -- when matched and PandA_Code different update them
    UPDATE SET T.PandA_Code = S.PandA_Code
WHEN NOT MATCHED BY TARGET -- When not matched by TARGET (there is in source but not in target)
    THEN INSERT (<field1, field2, ...>)  
        VALUES (<S.field1, S.filed2, ...>)  -- then insert them
OUTPUT deleted.*, $action, inserted.* INTO #TheTempTable; 
SELECT * FROM #TheTempTable;  -- here you can see the cnages and rollback if something is wrong
ROLLBACK TRAN;
GO 

答案 1 :(得分:1)

这可以通过使用join而不是merge语句来完成:

UPDATE T SET T.PandA_Code = S.PandA_Code FROM tblstart T 
INNER JOIN tblstars_new P ON P.Student_ID_Number = T.Student_ID_Number
WHERE T.PandA_Code <> S.PandA_Code