Since there is a minor return of attention to this topic, I would include an approach using dictionary.columns to construct the rename text, then use that text as a rename dataset name parameter in the inner join:
data stuff;
input ss zz a_abc $ a_qwerty $ a_xyz $ abcde;
datalines;
12 13 able charlie echo 16
14 15 baker delta foxtrot 17
run;
data stuff2;
input ss zz a_abc $ a_qwerty $ a_xyz $ abcde;
datalines;
12 13 rock just owl 18
14 15 cooperative modernize cassette 19
run;
proc sql noprint;
select catx('=',name,cats('a_',name)) into :rename_list_a separated by ' '
from dictionary.columns
where libname='WORK' and memname='STUFF' and not name in ('ss','zz');
select catx('=',name,cats('b_',name)) into :rename_list_b separated by ' '
from dictionary.columns
where libname='WORK' and memname='STUFF2' and not name in ('ss','zz');
create table want as select * from
stuff (rename=(&rename_list_a)) as a
inner join
stuff2 (rename=(&rename_list_b)) as b
on a.ss=b.ss and a.zz=b.zz ;
quit;
True, this renames ALL vars (except the join vars ss and zz), and the OP asked to rename only the common vars, but it wouldn't need much more code to rename only the common vars.
... View more