Oltre alla spiegazione di @zaratustra, la tua unione sta anche tentando di impostare il fn e ln allo stesso name valore in modo che non dia il risultato desiderato anche se ha funzionato. E non puoi usare fn o ln nel using clausola mentre stai cercando di aggiornarli.
Se il tuo name_test la tabella aveva una colonna chiave primaria (o almeno univoca), quindi potresti includerla nell'unione, ma saresti comunque in grado di aggiornare correttamente solo il fn o ln valore in un passaggio.
Non sono sicuro del motivo per cui non stai facendo un semplice aggiornamento:
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