Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为不匹配的值编写合并语句_Sql_Sql Server_Merge - Fatal编程技术网

Sql 为不匹配的值编写合并语句

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

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

在tblstars中查找tblstars中不存在的新行,然后将其添加到tblstars中非常简单

但是,我还需要在tblstars_new中查找列PandA_代码已更改的行,然后更新tblstars中相同的行

这个查询告诉我tblstars\u new中哪些行的PandA\u代码已经更改,需要在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
我试图找出一个合并语句来进行更改。就像我在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导入新的和更新的数据。那新的呢?