Além da explicação do @zaratustra, sua mesclagem também está tentando definir o
fn e ln para o mesmo name valor para que não desse o resultado que você deseja, mesmo que funcione. E você não pode usar fn ou ln no using cláusula enquanto você está tentando atualizá-los. Se o seu
name_test table tivesse uma coluna de chave primária (ou pelo menos exclusiva), então você poderia incluí-la na mesclagem, mas ainda seria capaz de atualizar corretamente o fn ou ln valor em uma passagem. Não sei por que você não está fazendo uma atualização simples:
update name_test nt
set fn = (select td.name from temp_distinct td where td.fn = nt.fn),
ln = (select td.name from temp_distinct td where td.fn = nt.ln);
8 rows updated.
select * from name_test;
FN LN
----- -----
Mich Steve
Mich Phil
Mark Dave
Mich Phil
Mich Dave
Phil John
Steve Dean
Steve Phil