Изглежда, че анализаторът не харесва това, въпреки факта, че е синтактично правилен. Вероятно двете вплетени и подредени клаузи го заслепяват някак си. Възпроизвеждах това.
Можете да използвате аналитична функция:
update table1 alf
set nextcontractid =
(SELECT min(contractid) keep (dense_rank first order by lasttradedate asc)
FROM table1copy alf2
WHERE alf2.assetid = alf.assetid
AND alf2.lasttradedate > alf.lasttradedate
)
where alf.complete = 0