merge没有by语句时为什么会报错
今天在工作中遇到一个问题,就是在整体跑程序的时候有一个程序报错了,问题是没有为merge语句指定by变量,但是单独跑这个程序的时候就没有问题,这个是使用很久的陈年老程序了,在多个项目中都有使用,今天不知道为什么会报这个错误。
merge语句大家都用过,就是对两个或多个数据集进行横向合并,merge后面可以用by语句,也可以不用by语句,他们之间有什么区别呢?
MEGER 后面没有by ,就是按行号连接的如:
data test1;
merge a b;
run;
也就是a 的第一行接b的第一行,并且如果名称一样的变量会被后表覆盖。第二行接第二行,如此下去。
但是MERGE后面有by的话,如:
data test2;
merge a b;
by id;
run;
那么就是按ID对接
举个例子:
a 表:
id x
01 x1
02 x2
b表 :
id y
01 y1
03 y2
程序
data test1;
merge a b;
run;
的结果是:
id x y
01 x1 y1
03 x2 y2
而merge by 的结果是:
id x y
01 x1 y1
02 x2 .
03 . y2
当然,Merge by得先排序。
显然merge后面不使用by语句也是可以的,报错的原因是在别的程序中设置了options。在实际应用中,一对一合并的情形不常见,多数情况是开发人员在进行匹配合并时忘记加BY语句,为了监控这种手工错误的发生,SAS提供了系统选项MERGENOBY=,这样就可在发生这种手工错误时给开发人员以必要的提醒,MERGENOBY=有三种取值:
MERGENOBY=NOWARN,这是系统的默认选项,在执行没有BY语句的MERGE语句时,系统进行一对一合并。
当MERGENOBY=WARN时,系统给出警告,“WARNING:没有为MERGE语句指定BY语句”。
当MERGENOBY=ERROR时,系统报错,“ERROR:没有为MERGE语句指定BY语句”。