如何在 SSMS 2008 中执行 IF EXISTS UPDATE ELSE INSERT 语法

How to execute IF EXISTS UPDATE ELSE INSERT syntax in SSMS 2008

IF EXISTS THEN UPDATE ELSE INSERT 在 SQL Server 2008

中未正确执行

我被告知 MERGE 可能会有用,但我的数据似乎不适用于此 - 它尝试更新记录两次,因为源中有重复记录 table

IF EXISTS (select 1
            from SCM_Top_Up_Operational O
            join SCM_Top_Up_Rolling R ON O.String = R.string)
BEGIN

UPDATE O SET                           O.Date_Added = R.Date_Added,
                                       O.Real_Exfact = R.Real_Exfact,
                                       O.Excess_Top_Up = R.Excess_Top_Up 

                               FROM    SCM_Top_Up_Operational O JOIN SCM_Top_Up_Rolling R ON O.String = R.String
                               WHERE   O.String = R.string
                               AND     R.Date_Added > O.Date_Added;
END         

ELSE 

BEGIN
   INSERT INTO SCM_Top_Up_Operational (String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant) 
          SELECT R.String,R.Date_Added,R.Real_Exfact,R.Article_ID,R.Excess_Top_Up,R.Plant 
          FROM SCM_Top_Up_Rolling R 
          WHERE R.String NOT IN (SELECT String FROM SCM_Top_Up_Operational)
END

预期的结果是更新 'Operational' table 中的任何记录,并将最新的记录添加到 'rolling' table - 这是通过在 'String' 字段上加入,该字段在 'Operational' table 中是唯一的,但在 'Rolling' table 中是重复的。唯一的区别是 'Date_Added' - 这是我从 'Rolling' table 中的最新记录更新的地方。如果没有匹配项,则转到 INSERT 语句,它将插入 'Rolling' table 中但不在 'Operational' table 中的任何行。我研究了许多其他线程,这个语法看起来是正确的。

问题是什么:

如果我执行整个语句,UPDATE 部分工作正常,但 ELSE INSERT 什么都不做 - 但是,如果我 运行 INSERT 单独执行,它也工作正常。我的猜测是我在语法中遗漏了一些小东西。如前所述,我被建议使用 MERGE,但由于我的数据的性质 - MERGE 中的 ON 语句会从源 table 中找到主键两次,并且 returns 会出错。有什么想法我可能在这段代码中遗漏了什么吗?我对 SQL 相当满意,但这些类型的陈述对我来说有些陌生..

您可以简单地编写此查询。

 UPDATE 
       O 
    SET                           
       O.Date_Added = R.Date_Added,
       O.Real_Exfact = R.Real_Exfact,
       O.Excess_Top_Up = R.Excess_Top_Up 
   FROM    
       SCM_Top_Up_Operational O JOIN SCM_Top_Up_Rolling R ON O.String = R.String
   WHERE   
       O.String = R.string
       AND R.Date_Added > O.Date_Added;

   INSERT INTO SCM_Top_Up_Operational 
            (String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant) 
         SELECT 
             R.String,
             R.Date_Added,R.Real_Exfact,R.Article_ID,R.Excess_Top_Up,R.Plant 
         FROM 
             SCM_Top_Up_Rolling R 
         WHERE 
             R.String NOT IN (SELECT String FROM SCM_Top_Up_Operational)