Tôi không nghĩ bạn cần vòng lặp. Tôi giả sử id của bạn là khóa chính và bạn không có ý định lặp lại crank nhiều lần trong ví dụ của mình.
Cái gì đó như thế này có hoạt động không?
Chỉnh sửa theo bình luận của Raj A. Thao tác này sẽ chỉ cập nhật các hàng mà một trong các trường khác đã thay đổi. Lưu ý rằng điều này sẽ không cập nhật các hàng trong đó một hàng là NULL và hàng kia không phải là 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 ...]