【问题标题】:Write a MERGE Statement for mis-matching values为不匹配的值编写 MERGE 语句
【发布时间】:2016-08-15 15:21:14
【问题描述】:

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

在 tblstars_new 中查找 tblstars 中不存在的行,然后将 then 添加到 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 

【问题讨论】:

  • 备份两个表并用新名称保存它们,然后进行测试。我希望它不会造成太大问题,并且安全 100 倍。
  • ~我认为只是将您的 WHEN NOT MATCHED 切换为 WHEN MATCHED 可能会很好,但尚未测试
  • 如果@sboahra 的答案解决了您的问题,那么which needs to import new and updated data from tblstars_new. 呢? new 呢?

标签: sql sql-server merge


【解决方案1】:

这是满足您要求的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 

【讨论】:

    【解决方案2】:

    这可以简单地通过使用 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 2023-03-31
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多