je pensais plus à un truc dans le style
update table2 AS table2
inner join table1 as table1
set table2.menu = table1.menu, table2.ss_menu = table1.ss_menu
where table2.code_naf like CONCAT (select codes_naf from table1 t1 where t1.codes_naf =table1.codes_naf) limit 1), '%')
mais du coup c'est débile voir pire que ce que tu as
Ce que tu souhaites faire ne semble pas clair.
tu veux mettre a jour des valeurs de table2 a partir de table1 sachant que tu n'as pas un code complet ?
j'y vois un risque de mettre le souk si tu ne peux pas t'appuyer sur une donnée fiable (il y a peux être des codes : 12, 123, ou 123456 et la c'est le drame

).
ce qu'il faut c'est être certain de la correspondances pour mettre les bonnes valeurs.
il y a plus grossiers mais peux être fonctionnel
update table2 t2
set
menu = (select menu from table1 t1 where t1.code_naf like concat( t2.codes_naf,'%'))
ss_menu = (select ss_menu from table1 t1 where t1.code_naf like concat( t2.codes_naf,'%'))
on pourrait aussi imaginer
update table2 t2
set
menu = menu1,
ss_menu = ssmenu1
from (
select menu from table1 t1 where t1.code_naf like concat( t2.codes_naf,'%')
)
bon a priori mysql n'aime pas la référence de la table que tu mets à jours dans le prédicat.
du coup reste la jointure ou une procédure stockée qui va parcourir la table et faire les select qui vont bien, le tout dans le même transaction qui lock la table pour éviter les soucis).
pour infos tes alias sont inutiles (dire que table1 est renommer en table1 c'est un peu redondant

)
@+