我没什么问题。我有一个大桌子和几个小桌子,其中的小桌子包括大桌子的部分字段。如何在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?
谢谢您的帮助!
答案 0 :(得分:1)
对我来说,您打算执行什么操作不是很清楚,但是一些初步想法是:
MERGE
子句进行联接,或更优雅地使用PROC SQL
。 temp1
和temp2
中的哪两行-通常,您要连接到两个表中都可用的列。 为帮助我们解决您的问题,如果您在temp1
和temp2
上执行此操作,是否可以提供正确的输出?这将显示您探索了哪些选项,以及在那里需要修复的内容。
答案 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;
中有关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 ;