SAS将小表联接(或插入)到大表

时间:2019-02-06 11:28:38

标签: insert sas

我没什么问题。我有一个大桌子和几个小桌子,其中的小桌子包括大桌子的部分字段。如何在if字段相同的情况下插入(或并集)表-设置数据,如果小表没有big的字段-在大表中设置null / 0。

示例:

data temp1;
infile DATALINES dsd missover;
input a b c d e f g;
CARDS;
1, 2, 3, 4,5,6
2, 3, , 5
3, 3
4,,3,2,3,
;
run;

data temp2;
infile DATALINES dsd missover;
input a c e g;
CARDS;
5, 2, 3, 4
6, 3, , 5
7, 3
;
run;

是否有一种优雅的方法,如果我在temp1中插入temp2-temp2中缺少字段将在temp1中将值设置为null?

谢谢您的帮助!

3 个答案:

答案 0 :(得分:1)

对我来说,您打算执行什么操作不是很清楚,但是一些初步想法是:

  1. 要比较两个数据集之间的列(并检查其中之一是否存在值),最好使用外部联接。您可以通过数据步骤中的MERGE子句进行联接,或更优雅地使用PROC SQL
  2. 但是,无论使用哪种方法,您都必须指定要比较temp1temp2中的哪两行-通常,您要连接到两个表中都可用的列。

为帮助我们解决您的问题,如果您在temp1temp2上执行此操作,是否可以提供正确的输出?这将显示您探索了哪些选项,以及在那里需要修复的内容。

答案 1 :(得分:1)

您应该尝试proc append。这样会更加有效,因为您不会像in那样一次又一次地读取大表

 /*reads temp1 which is big table and temp2*/

 data temp3; 
 set temp1 temp2;
  run;

/ *这与上面的代码几乎一样,但不会读取您的大表    并且会高效* /

proc append base=temp1 data=temp2 force;
 run;

文档http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#n19kwc3onglzh2n1l2k4e39edv3x.htm

中有关proc追加的更多信息

答案 2 :(得分:1)

这正是SAS默认情况下所做的。

data want ; 
  set have1 have2;
run;

它将按名称匹配变量,并且任何不存在的变量(在任一源中)都将缺少值。

为了在将小表追加到大表时获得更好的性能,应使用PROC APPEND代替数据步骤,以避免必须为大数据集制作新副本。那更像是“插入”。 FORCE选项将允许数据集不同。但是,由于将新数据添加到旧数据集中,所有仅出现在HAVE2中的额外变量将被忽略,并且其值将丢失。

proc append base=have1 data=have2 force ;
run;

如果确实需要生成实际的INSERT语句(也许您实际上是在尝试生成SQL代码以在外部数据库中运行),则可能需要比较两个数据集的元数据并找到通用的变量。

proc contents data=have1 out=cont1 noprint; run;
proc contents data=have2 out=cont2 noprint; run;
proc sql noprint;
  select a.name into :varlist separated by ','
  from cont2 a 
  inner join cont1 b 
  on upcase(a.name) = upcase(b.name)
  ;
...
insert into have1 (&varlist) select &varlist from have2 ;