Вот решение на основе формата:
data table1;
length id id1 id2 id3 id4 id5 8;
infile datalines missover;
input id id1 id2 id3 id4 id5;
cards;
1005 2005 3005 4005 5005 7105
3005 4005 5005 7105
4005 5005 7105
5005 7105
2005 3005 4005 5005 7105
7105
;
run;
data table2;
length id 8 names $ 10;
input id names;
cards;
1005 John
3005 Rick
4005 Sam
5005 Harry
2005 Mary
7105 Deena
;
run;
* Create a CNTLIN data set defining the required format;
data fmt_in;
set table2;
fmtname = 'names';
start = id;
label = names;
run;
* Run PROC FORMAT to generate the format from the CNTLIN data set;
proc format cntlin=fmt_in;
run;
* Apply the format to the input data set;
data out;
set table1;
namesID = put(id, names.);
namesID1 = put(id1, names.);
namesID2 = put(id2, names.);
namesID3 = put(id3, names.);
namesID4 = put(id4, names.);
namesID5 = put(id5, names.);
run;
Это будет очень эффективно для больших входов, поскольку не требует многократных сортировок.В общем, конечно, ваш входной набор данных table1
должен быть нормализован, чтобы быть высоким и тонким, чтобы был только один столбец, содержащий идентификаторы;это сделало бы решение на основе слияния тривиальным, хотя, вероятно, все еще медленнее, чем использование формата.