Слияние: если источник не соответствует - обновите строки
Я пытаюсь выяснить функцию слияния, где я должен обновить строки, которые существуют в целевой таблице, но эти строки не совпадают со строками в исходной таблице.
Те, которые не совпадают в исходной таблице, я хотел бы обновить в строке, где написано, КОГДА НЕ СОГЛАСОВАНО ИСТОЧНИКОМ что-то вроде 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);