吕小布韦 发表于 2013-7-30 13:25 
那,这个问题是怎么产生的呢?不是说merge语句会用后面一个数据集的变量覆盖掉前面一个数据集的。
这种情况是在进行多对一或一对多merge时很容易忽略的。
楼主的例子中merge数据集D和C时属于多对一merge。这里的关键一点在于,SAS对于C中的每条记录只会读取一遍。以a=2, sex=1为例,SAS的读取过程是这样的:
1.
a. 读取数据集D的第4条记录,PDV中变量b的值为空值;
b. 读取数据集C的第1条记录,PDV中变量b的值被C中变量b的值676覆盖;
c. OUTPUT
2.
a. 读取数据集D的第5条记录,PDV中变量b的值676被新读入的空值覆盖;
b. OUTPUT (这里不会再次读取数据集C中的记录,因为C中只有一条满足a=2,sex=1的记录);
3. 同2,会读入数据集D的第六条记录,新读入的变量b的空值覆盖原来的空值,然后OUTPUT;
楼主所说的后面数据集的变量值覆盖前面数据集的变量值,只有在SAS对这两个数据集同时读取的时候才会发生,如一对一,多对多的merge。而多对一的merge,因为对于每一组,后面的"一"只会读取一次,所以也就只会“覆盖”一次。