SQL MERGE только при изменении - PullRequest
0 голосов
/ 24 января 2020

На SQL MERGE как вставить оператор типа "ничего не делать"? Например, у меня есть это прямо сейчас:

MERGE INTO dbo.Worker AS T
USING dbo.Collector_Worker AS S
ON T.WWID = S.WWID 
WHEN MATCHED THEN UPDATE SET
    T.IDSID = S.IDSID,
    ...
WHEN NOT MATCHED THEN
    INSERT (WWID, IDSID, ...)
    VALUES (S.WWID, S.IDSID, ...)
WHEN NOT MATCHED BY SOURCE THEN
     UPDATE SET T.Person_Status_Type = 'INACTIVE', T.Active = 0;

Есть тонна других столбцов, где символы .... Так что это прекрасно работает, за исключением того факта, что он обновляет каждую строку, которая уже существует, даже если нет никаких изменений. Поскольку в таблице миллион строк, это масса ненужных изменений. Я хочу обновить строку только в случае внесения изменений.

Если я попытаюсь просто добавить AND T.IDSID <> S.IDSID в оператор ON, произойдет сбой, потому что теперь он пытается выполнить оператор INSERT.

Ответы [ 2 ]

2 голосов
/ 24 января 2020

На самом деле я сделал это сложно. Все, что мне нужно сделать, это поставить дополнительные запросы на WHEN MATCHED, и тогда все будет работать как нужно, без обновлений, если что-то не изменилось.

2 голосов
/ 24 января 2020

Вы можете добавить выражение в WHEN:

WHEN NOT MATCHED BY SOURCE AND T.IDSID <> S.IDSID THEN
     UPDATE SET T.Person_Status_Type = 'INACTIVE',
                T.Active = 0;
...