Предполагая, что вы используете SQLServer 2005 (основываясь на сообщении об ошибке, полученном в предыдущей попытке), вероятно, самый простой способ сделать это - использовать пару функций ROW_NUMBER () с выражением Common Table, я думаю, что это может делай то, что ищешь:
WITH result AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY SpouseID ORDER BY FromDate DESC) as rowNumber,
*
FROM
SpousePreviousAddresses
)
UPDATE SpousePreviousAddresses
SET
AddressTypeID = 2
FROM
SpousePreviousAddresses spa
INNER JOIN result r ON spa.SpouseId = r.SpouseId
WHERE r.rowNumber = 1
AND spa.PreviousAddressID = r.PreviousAddressID
AND spa.CountryID = 181
В SQLServer2005 функция ROW_NUMBER () является одной из самых мощных. Это очень полезно во многих ситуациях. Время, потраченное на его изучение, будет многократно окуплено.
CTE используется для простоты кода abit, поскольку устраняет необходимость во временной таблице какого-либо вида для хранения промежуточного результата.
Полученный запрос должен быть быстрым и эффективным. Я знаю, что выборка в CTE использует *, что немного излишне, поскольку нам не нужны все столбцы, но это может помочь показать, что происходит, если кто-то хочет увидеть, что происходит внутри запроса.