merge沒(méi)有by語(yǔ)句時(shí)為什么會(huì)報(bào)錯(cuò)

今天在工作中遇到一個(gè)問(wèn)題,就是在整體跑程序的時(shí)候有一個(gè)程序報(bào)錯(cuò)了,問(wèn)題是沒(méi)有為merge語(yǔ)句指定by變量,但是單獨(dú)跑這個(gè)程序的時(shí)候就沒(méi)有問(wèn)題,這個(gè)是使用很久的陳年老程序了,在多個(gè)項(xiàng)目中都有使用,今天不知道為什么會(huì)報(bào)這個(gè)錯(cuò)誤。

merge語(yǔ)句大家都用過(guò),就是對(duì)兩個(gè)或多個(gè)數(shù)據(jù)集進(jìn)行橫向合并,merge后面可以用by語(yǔ)句,也可以不用by語(yǔ)句,他們之間有什么區(qū)別呢?

MEGER 后面沒(méi)有by ,就是按行號(hào)連接的如:

data test1;
merge a b;
run;
也就是a 的第一行接b的第一行,并且如果名稱(chēng)一樣的變量會(huì)被后表覆蓋。第二行接第二行,如此下去。

但是MERGE后面有by的話(huà),如:

data test2;
merge a b;
by id;
run;
那么就是按ID對(duì)接

舉個(gè)例子:

a 表:

id   x

01   x1

02   x2

b表 :

id   y

01   y1

03   y2

程序

data test1;
merge a b;
run;
的結(jié)果是:

id  x  y

01  x1  y1

03  x2  y2

而merge by 的結(jié)果是:

id  x   y

01  x1  y1

02  x2  .

03   .  y2

當(dāng)然,Merge by得先排序。

顯然merge后面不使用by語(yǔ)句也是可以的,報(bào)錯(cuò)的原因是在別的程序中設(shè)置了options。在實(shí)際應(yīng)用中,一對(duì)一合并的情形不常見(jiàn),多數(shù)情況是開(kāi)發(fā)人員在進(jìn)行匹配合并時(shí)忘記加BY語(yǔ)句,為了監(jiān)控這種手工錯(cuò)誤的發(fā)生,SAS提供了系統(tǒng)選項(xiàng)MERGENOBY=,這樣就可在發(fā)生這種手工錯(cuò)誤時(shí)給開(kāi)發(fā)人員以必要的提醒,MERGENOBY=有三種取值:

MERGENOBY=NOWARN,這是系統(tǒng)的默認(rèn)選項(xiàng),在執(zhí)行沒(méi)有BY語(yǔ)句的MERGE語(yǔ)句時(shí),系統(tǒng)進(jìn)行一對(duì)一合并。

當(dāng)MERGENOBY=WARN時(shí),系統(tǒng)給出警告,“WARNING:沒(méi)有為MERGE語(yǔ)句指定BY語(yǔ)句”。

當(dāng)MERGENOBY=ERROR時(shí),系統(tǒng)報(bào)錯(cuò),“ERROR:沒(méi)有為MERGE語(yǔ)句指定BY語(yǔ)句”。





請(qǐng)前往:http://lygongshang.com/TeacherV2.html?id=166