Возвращаясь к концу этого вопроса здесь , есть ли способ поместить оператор CASE
в SQL UPDATE
, который либо обновляет, либо ничего не делает. В настоящее время у меня есть ниже:
UPDATE CustomerAddress
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id
Проблема возникает в этой строке:
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE **0** END
Когда я устанавливаю его на 0 в противном случае. Обновление должно проверить первое условие, и если это так, установить в 1, но если условие не выполняется, я не хочу устанавливать в 0, мне нужно сохранить исходное значение.
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *CustomerAddress.IsPrimary* END
Однако не работает, потому что он получает значение из оператора FROM
, а не то значение, которое было установлено в данный момент. Что я хочу, это что-то вроде
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *Do nothing* END
Но это все еще задание, и оно пытается установить на NULL
.
Возможно ли это выше?
UPDATE:
Пример данных:
пара идентификаторов, которые представляют адрес как таковой
ID to keep ID to delete
------------------------
10 21
10 22
11 31
12 41
Я сосредоточусь на том, что происходит с 10. Итак, 10 имеет IsPrimaryAddress=0
, 21 имеет IsPrimaryAddress=1
, а 22 имеет IsPrimaryAddress=0
.
Я полагаю, что происходит следующее (в псевдокоде):
Установить IsPrimaryAddress = если 21.IsPrimaryAddress = 1, затем установить 21.IsPrimaryAddress, иначе установить 10.IsPrimaryAddress
Итак, мы установили 10.IsPrimaryAddress равным 1. Теперь:
Установить IsPrimaryAddress = если 22.IsPrimaryAddress = 1, затем установить 22.IsPrimaryAddress, иначе установить 10.IsPrimaryAddress
Что, я бы надеялся, 10.IsPrimaryAddress равно 1. Но, похоже, получено исходное значение, равное 0, и теперь обновление потеряно.