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语句”。





请前往:http://www.mark-to-win.com/TeacherV2.html?id=166