使用SAS中的另一个表更新表

时间:2016-02-26 15:50:01

标签: sql sas

我有表t1和t2,如何创建表t3?基本上我想更新t1中的Var2,其中t1.Key = t2.Key,使用来自t2的数据,同时保持t1中的其他内容相同。

表t1

Key Var1 Var2

1    A    AA
2    B    BB
3    C    CC
4    D    DD
5    E    EE

表t2

Key Var1 Var2
3    C    XX
4    D    YY
6    F    FF

表t3

Key Var1 Var2
1    A    AA
2    B    BB
3    C    XX
4    D    YY
5    E    EE

以下SAS代码只会给我错误:

proc sql;
update t1 
set  var2 = t2.var2
from t1
inner join t2 on 
t1.key=t2.key;
quit;

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在数据步骤中使用update语句。 Update语句与merge语句非常相似,只是除非您指定,否则它们不会使用缺失值替换填充值。此外,非唯一键会生成警告,这有助于调试。

更新表并同时创建新表的一般语法:

<强>语法

data NewTable;
    update MasterTable
           TransactionTable;
    by key(s);
run;

为了对您的数据执行update操作,您需要确保您的两个数据集按键变量排序或索引。如果没有排序或索引,SAS会抱怨并且更新将失败。通常,我只需要在创建主数据集或事务数据集时需要执行的最后步骤中添加index选项。它可以节省一些时间,因为可以防止额外的排序步骤。

第1步:确保表1和表1 2被索引或按键排序

data t1(index=(key) );
    <ETL stuff>;
run;

data t2(index=(key) );
    <ETL stuff>;
run;

步骤2:通过使用来自t2的匹配值更新t1来创建新表t3

data t3(index=(key) );
   update t1(in=t1_key)  /* Same thing as SQL t1.key */
          t2(in=t2_key); /* Same thing as SQL t2.key */
   by key;

   /* This is SAS's way of specifying a left-join */
   if(t1_key);
run;

虽然您在此处index=并未特别需要t3选项,但最好将您的密钥变量编入索引或对其应用完整性约束。

答案 1 :(得分:0)

可以这样做:

data t1;
  input Key Var1 $ Var2 $;
  datalines;
1    A    AA
2    B    BB
3    C    CC
4    D    DD
5    E    EE
;

data t2;
  input Key Var1 $ Var2 $;
  datalines;
3    C    XX
4    D    YY
6    F    FF
;

title 'Table T1';
proc print data=t1 noobs;run;

title 'Table T2';
proc print data=t2 noobs;run;

更新自身:

proc sql;
  update t1 set var2 = (select var2 from t2 where t2.key=t1.key)
    where t1.key in(select key from t2);
quit;

检查:

title 'Updated T1';
proc print data=t1 noobs;run;

enter image description here enter image description here enter image description here