CTE каким-то образом знает, как идентифицировать строки для ОБНОВЛЕНИЯ или УДАЛЕНИЯ.
Но чтобы на самом деле ОБНОВИТЬ определенный столбец, вам также необходимо включить его в CTE.
Для УДАЛЕНИЯ это не обязательно.
И тогда вы могли бы также просто включитьдругие поля, которые вы используете в этом ROW_NUMBER.
Это облегчает копирование запроса CTE, тестирование его вручную перед внесением каких-либо изменений.
Кроме того, я сомневаюсь, что вам действительно нужно valido
вPARTITION BY
для поиска дубликатов (id_gen, perpro).
WITH CTE AS
(
SELECT
id_gen, perpro, ini, valido,
ROW_NUMBER() OVER (PARTITION BY id_gen, perpro ORDER BY ini DESC) RN
FROM tstSolap
)
UPDATE CTE
SET valido = 0
WHERE RN > 1
AND (valido IS NULL OR valido <> 0)
Или если вы хотите исправить оба 0 или 1
WITH CTE AS
(
SELECT
id_gen, perpro, ini, valido,
IIF(ROW_NUMBER() OVER (PARTITION BY id_gen, perpro ORDER BY ini DESC) = 1, 1, 0) AS new_valido
FROM tstSolap
)
UPDATE CTE
SET valido = new_valido
WHERE (valido != new_valido OR valido IS NULL)