Как выполнить синтаксис IF EXISTS UPDATE ELSE INSERT в SSMS 2008 - PullRequest
0 голосов
/ 02 апреля 2019

ЕСЛИ СУЩЕСТВУЕТ ТОЛЬКО ОБНОВЛЕНИЕ, ЧТО-ТО НЕ ВСТАВЛЯЕТСЯ В SQL Server 2008

Мне сообщили, что MERGE может быть полезен, но мои данные, кажется, не подходят для этого - он пытается ОБНОВИТЬ записи дважды, потому что в исходной таблице есть повторяющиеся записи

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

Ожидаемым результатом будет ОБНОВЛЕНИЕ любых записей в таблице «Оперативные» с добавлением последней записи МОСТ в таблицу «прокручивания» - это достигается с помощью JOIN в поле «Строка», которое является уникальным в «Оперативном» 'но дублируется в таблице' Rolling '. Единственное отличие состоит в 'Date_Added' - это то место, где я должен был бы ОБНОВИТЬ самую последнюю запись в таблице 'Rolling'. Если совпадений нет, переходите к оператору INSERT, где он будет вставлять любые строки, которые присутствуют в таблице «Rolling», но отсутствуют в таблице «Operational». Я исследовал много других потоков, и этот синтаксис выглядит правильно.

В чем проблема:

Если я выполняю весь оператор, часть UPDATE работает нормально, но ELSE INSERT ничего не делает - однако, если я запускаю INSERT самостоятельно, он также работает нормально. Я предполагаю, что мне не хватает чего-то маленького в синтаксисе. Как уже упоминалось, мне посоветовали использовать MERGE, но из-за характера моих данных - оператор ON в MERGE дважды найдет первичный ключ из исходной таблицы и выдаст ошибку. Любые идеи, что я могу упустить в этом коде? Я довольно хорошо разбираюсь в SQL, но эти типы утверждений несколько новы для меня ..

1 Ответ

1 голос
/ 02 апреля 2019

Вы можете просто написать этот запрос.

 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)
...