Слияние: если источник не соответствует - обновите строки

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

Те, которые не совпадают в исходной таблице, я хотел бы обновить в строке, где написано, КОГДА НЕ СОГЛАСОВАНО ИСТОЧНИКОМ что-то вроде
Update PEOPLE set UPD = null,target.CHANGE = CURRENT_TIMESTAMP where target.ID = source.ID and target.UPD is not null and target.CHANGE is null

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

Например, это строки в PEOPLE:

ID не уникален, это ID группы

ID, фамилия, имя, UPD, ПРОВЕРЕНО

4345,JOHN,DOE,1 - этого не существует (его ID не существует) в '#PEOPLE, потому что это вставка из более раннего слияния из более раннего #PEOPLE, который теперь изменился

879,MARY,HON,1 - этот существует в #PEOPLE

9875, CHRISTIAN, TROY, 1 - этот не соответствует строке, но его идентификатор существует в PEOPLE и #PEOPLE

Таким образом, из этого списка я хочу, чтобы ДЖОН ДУ оставался в том же состоянии, что и его идентификатор не завершается в #PEOPLE, а КРИСТИАНСКИЙ ТРОЙ получает обновление, где UPD будет иметь значение NULL, а CHANGE = CURRENT_TIMESTAMP, но только если UPD не равен NULL, а CHANGE - NULL, потому что его ID существует в PEOPLE и #PEOPLE, но вся строка не совпадает.

MERGE INTO PEOPLE WITH (HOLDLOCK) AS target
USING #PEOPLE AS source

 on isnull(target.ID,'') = isnull(source.ID,'') 
 and isnull(target.NAME,'') = isnull(source.NAME,'') 
 and isnull(target.SURNAME,'') = isnull(source.SURNAME,'') 

WHEN MATCHED THEN 
    UPDATE SET target.UPD = 1
WHEN NOT MATCHED BY TARGET THEN
    INSERT (ID,NAME,SURNAME,UPD) 
    VALUES (source.ID ,source.NAME ,source.SURNAME,1)

WHEN NOT MATCHED BY SOURCE and target.UPD is not null and target.CHANGE is null THEN
  update set UPD = NULL,target.CHANGE  = CURRENT_TIMESTAMP

Есть идеи?

1 ответ

Решение

Было немного сложно прочитать все это, но насколько я вижу, у вас нет FK в вашей таблице, и именно поэтому вы должны сделать обновление после слияния.

Вы могли бы использовать OUTPUT, но, возможно, самый простой способ - сделать такие обновления. если найдено совпадение UPD=2, и если это так, вставьте UPD = 3.. Итак, теперь у вас есть в UPD = 1 те, которые не совпадают, чтобы вы увидели, какие идентификаторы есть в #People, и обновите их:

MERGE INTO PEOPLE WITH (HOLDLOCK) AS target
USING #PEOPLE AS source

 on isnull(target.ID,'') = isnull(source.ID,'') 
 and isnull(target.NAME,'') = isnull(source.NAME,'') 
 and isnull(target.SURNAME,'') = isnull(source.SURNAME,'') 

WHEN MATCHED THEN 
    UPDATE SET target.UPD = 2
WHEN NOT MATCHED BY TARGET THEN
    INSERT (ID,NAME,SURNAME,UPD) 
    VALUES (source.ID ,source.NAME ,source.SURNAME,3)

;

UPDATE PEOPLE set UPD = null,CHANGE = CURRENT_TIMESTAMP where UPD = 1 and CHANGE is null and ID in (Select distinct ID from #PEOPLE);
UPDATE PEOPLE set UPD = 1 where (UPD =2 or UPD=3) and MB in (Select distinct MB from #PEOPLE);
Другие вопросы по тегам