SQL Merge - вставка только там, где был обновлен определенный столбец - PullRequest
0 голосов
/ 28 октября 2019

У меня есть оператор слияния, который выглядит следующим образом:

...
WHEN NOT MATCHED BY TARGET then Insert
(ID,
Status, 
Read,
User,
ChangeDate)
VALUES
(Source.ID,
Source.Status,
Source.Read,
Source.User,
Source.ChangeDate)
...

В настоящее время я использую ID, Status и ChangeDate для сопоставления источника и цели. Иногда ChangeDate может измениться без каких-либо фактических изменений в строке. Мне нужно, чтобы мой оператор слияния выполнялся и вставлял новую строку, только если Source.Status не совпадает с последним Target.Status, основанным на ChangedDate.

Моя текущая целевая таблица выглядит следующим образом

ID    Status    Read    User    ChangeDate
33    Read       Yes     76     01-Jun-2019
33    Closed     Yes     76     12-Jun-2019
33    Read       Yes     76     23-Jun-2019

Мой оператор слияния хочет вставить следующую строку в эту таблицу

ID    Status    Read    User    ChangeDate
33    Read       Yes     76     24-Jun-2019

Я не хочу этогослучиться потому, что, хотя ChangeDate был изменен, статус такой же, как и в предыдущей строке (23 июня 2019 г.)

Если мое объединение снова запустилось и попытался вставить строку ниже

ID    Status    Read    User    ChangeDate
33    Closed     Yes     76     30-Jun-2019

Тогда будет вставлена ​​новая строка, так как статус «Закрыт» не совпадает с предыдущим статусом «Чтение».

Ценю любую помощь в этом, я не могу придумать способ обойти это в настоящее время.

Спасибо, Джессика

Пытался объединить несколько разных столбцов

1 Ответ

0 голосов
/ 01 ноября 2019

вы не можете использовать поле ChangeDate, чтобы соответствовать источнику, из-за этого, ваше слияние всегда вставляется

и об обновлении вы можете сделать так:

WHEN MATCHED AND (trg.example_column <> src.example_column 
   OR trg.example_column_2 <> src.example_column_2) THEN UPDATE
   SET 
   [VERSION] = tgt.ChangeDate = GETDATE()
...