ループは必要ないと思います。 IDが主キーであり、例でクランクを数回繰り返すつもりはなかったと思います。
このようなものは機能しますか?
RajAのコメントに従って編集します。これにより、他のフィールドの1つが変更された行のみが更新されます。これは、一方がNULLで、もう一方がNULLではない行を更新しないことに注意してください。
MERGE INTO final T
USING ( SELECT id, score, crank, urank FROM test ) S
ON ( S.vid = T.id AND
( S.crank != T.crank OR S.score != T.score OR S.urank != T.urank ))
WHEN MATCHED SET crank = S.crank, score = S.score,
crank = S.crank, urank = S.urank
WHEN NOT MATCHED THEN INSERT
[... not sure what you want to do in this case ...]