Sql 基于一个变量值的多个数据集/表的条件组合

Sql 基于一个变量值的多个数据集/表的条件组合,sql,join,merge,sas,Sql,Join,Merge,Sas,我看到了一些与我的问题相关的问题,但从来没有完全相同的结构,而且由于我对SAS/SQL非常陌生,我无法找到解决问题的正确方法 我尝试了几天来加入多个表(大约30个) 基本上,我的问题归结为: 假设我有3张桌子: 选项卡,带有两个变量V1和V2 t1,带有两个变量V2和V3 t2,具有相同的2个变量V2和V3 我想根据V2的值将TAB与t1或t2连接起来,以获得完整的_表 TAB V1 V2 A 1 B 1 C 2 D 2 t1 V2 V3 1 x 1 y 1 z

我看到了一些与我的问题相关的问题,但从来没有完全相同的结构,而且由于我对SAS/SQL非常陌生,我无法找到解决问题的正确方法

我尝试了几天来加入多个表(大约30个)

基本上,我的问题归结为:

假设我有3张桌子:

选项卡,带有两个变量V1和V2 t1,带有两个变量V2和V3 t2,具有相同的2个变量V2和V3

我想根据V2的值将TAB与t1或t2连接起来,以获得完整的_表

TAB
V1  V2
A   1
B   1
C   2
D   2

t1
V2  V3
1   x
1   y
1   z

t2
V2  V3
2   h
2   i
2   j
预期结果:

Full_TABLE
V1   V2   V3
A    1    x
A    1    y
A    1    z
B    1    x
B    1    y
B    1    z
C    2    h
C    2    i
C    2    j
D    2    h
D    2    i
D    2    j
从逻辑上讲,它是基于V2值的条件联接:

  • 如果V2=1,则将制表符与t1合并

  • 如果V2=2,则将制表符与t2合并

我不知道是否有可能自动完成

粗略地说,V1有30000个不同的值,V2有27个(因此有27个表t1-t27),V3每个V2值有10个值,因此我希望有一个30.000*10=300.000行的完整表格

因此,我可以管理一个基于V2和/或V3的半自动化解决方案,而不是V1

非常感谢SAS或SQL(或proc SQL…)领域的任何潜在客户


S

您可以使用
proc-sql
和一些sql技巧来实现这一点:

proc sql;
    select tab.v1, tab.v2, coalesce(t1.v3, t2.v3) as v3
    from tab left join
         t1
         on tab.v2 = 1 left join
         t2
         on tab.v2 = 2;

数据步骤解决方案很有趣:

data want;
  set tab;
  if v2=1 then do;
    do _n_ = 1 to nobs_t1;
      set t1 point=_n_ nobs=nobs_t1;
      output;
    end;
  end;
  else if v2=2 then do;
    do _n_=1 to nobs_t2;
      set t2 point=_n_ nobs=nobs_t2;
      output;
    end;
  end;
run;
这是标准的“数据步骤中的笛卡尔连接”,只做了两次,if告诉SAS该做什么


基本上,根据v2的值,使用
迭代t1或t2。如果需要允许许多表/变量值(类似于扩展sql解决方案的方式),可以通过宏语言进行扩展。

在我看来,T1和T2是同一个表,根据V2的值被拆分为两个。为什么不把他们联合起来然后加入呢

proc sql ;
   create table want as 
     select a.*,b.v3
     from tab a
        , (select * from t1 union select * from t2) b
     where a.v2 = b.v2
   ;
quit;

对于中等大小的数据集,特别是适合内存的t1/t2,这比SQL快得多—大约快10倍。对于t1/t2不适合内存的超大数据集,我不确定它是否快得多(我没有时间测试多分钟写入,而且随着t1/t2变大,它需要更长的时间)。