Sql 为不匹配的值编写合并语句
我有一个表tblstars_new,客户每周更新一次。我还有另一个表tblstars,它需要从tblstars\u new导入新的和更新的数据 在tblstars中查找tblstars中不存在的新行,然后将其添加到tblstars中非常简单 但是,我还需要在tblstars_new中查找列PandA_代码已更改的行,然后更新tblstars中相同的行 这个查询告诉我tblstars\u new中哪些行的PandA\u代码已经更改,需要在tblstars中更新Sql 为不匹配的值编写合并语句,sql,sql-server,merge,Sql,Sql Server,Merge,我有一个表tblstars_new,客户每周更新一次。我还有另一个表tblstars,它需要从tblstars\u new导入新的和更新的数据 在tblstars中查找tblstars中不存在的新行,然后将其添加到tblstars中非常简单 但是,我还需要在tblstars_new中查找列PandA_代码已更改的行,然后更新tblstars中相同的行 这个查询告诉我tblstars\u new中哪些行的PandA\u代码已经更改,需要在tblstars中更新 SELECT sn.* F
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
我试图找出一个合并语句来进行更改。就像我在Prod做的那样,我真的不能到处玩。两个问题:
1是否可以在不实际执行更改的情况下查看更改
2下面的合并语句正确吗
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
这只需使用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
这只需使用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
下面是满足您的请求的合并查询
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
下面是满足您的请求的合并查询
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
对两个表进行备份,并用新名称保存它们,然后进行测试。我希望它不会引起太多的问题,而且安全性是100倍。~我认为只要将您的WHEN NOT MATCHED切换到WHEN MATCHED可能会很好地工作,但尚未测试@sboahra的答案是否解决了您的问题。您需要从tblstars\u new导入新的和更新的数据。新的呢?备份两个表并用新名称保存它们,然后进行测试。我希望它不会引起太多的问题,而且安全性是100倍。~我认为只要将您的WHEN NOT MATCHED切换到WHEN MATCHED可能会很好地工作,但尚未测试@sboahra的答案是否解决了您的问题。您需要从tblstars\u new导入新的和更新的数据。那新的呢?