Merge 在SAS中使用proc SQL合并所有可能匹配变量的3个表

Merge 在SAS中使用proc SQL合并所有可能匹配变量的3个表,merge,sas,multiple-tables,proc-sql,Merge,Sas,Multiple Tables,Proc Sql,我在SAS中有3个数据集: 主楼1 ID Rep Dose Response 1 2 34 567 1 1 45 756 2 1 35 456 3 1 56 345 主要功能2 ID Rep Hour Day 1 1 89 157 2 1 62 365 3 1 12 689 主要功能3 ID Rep Town City 1 1 3268 151643 2 1 2574 1

我在SAS中有3个数据集:

主楼1

ID Rep Dose Response
1   2   34    567
1   1   45    756
2   1   35    456
3   1   56    345
主要功能2

ID Rep Hour Day
1   1   89  157
2   1   62  365
3   1   12  689
主要功能3

ID  Rep  Town   City
1   1    3268   151643
2   1    2574   165435
3   1    1254   135435
2   2    1563   135435
在将表导入SAS之后,我目前有以下proc SQL代码(我非常抱歉它的可怕)来合并表,以便每个ID和Rep包含所有相关信息。我似乎无法有效地合并所有3个表,因为main_1没有包括所有可能的ID和Rep组合(实际上没有一个包括):

生成了以下内容,但缺少1个观察值:

   ID   Rep Dose    Response    Hour    Day   Town    City
    1    1   45       756        89     157   3268   151643
    1    2   34       567        -       -      -      -
    2    1   35       456        62     365   2574   165435
    3    1   56       345        12     689   1254   135435
我需要合并所有可能的匹配项,以实现以下目标:

ID  Rep Dose    Response    Hour    Day   Town    City
1    1   45       756        89     157   3268   151643
1    2   34       567        -       -      -      -
2    1   35       456        62     365   2574   165435
2    2   -         -         -       -    1563   135435
3    1   56       345        12     689   1254   135435
如果上面的代码是完全错误的方法,我很乐意学习其他SQL替代方案


非常感谢。

您需要使用
完全连接
而不是
左连接

试试这个:

PROC SQL; 
    create table merged_sql_2 as 
    select coalesce(a.id,b.id,c.id) as id,
           coalesce(a.rep,b.rep,c.rep) as rep,
           a.dose,
           a.response,
           B.hour,
           B.day,
           C.Town,
           C.City
    from main_1 as A 
    FULL JOIN main_2 as B 
        on A.ID = B.ID
        and A.Rep = B.Rep
    FULL JOIN main_3 as C 
        on A.ID = C.ID
        and A.Rep = C.Rep;
QUIT;

COALESCE()
函数从列表中选择第一个非空值。这使您可以保留任何参与行的表中的键。

使用完全自然联接也可以:

proc sql;
    create table new as 
    select rep, dose, response, hour, day, town, city from 
    Main_1 natural full join Main_2 natural full join Main_3 
 ;
quit;
proc sql;
    create table new as 
    select rep, dose, response, hour, day, town, city from 
    Main_1 natural full join Main_2 natural full join Main_3 
 ;
quit;