今天得空,补充讲一下ADV考试时一道最让楼主纠结,来回改了几遍答案的题。
其实题干就是prep guide上讲match merge和SQL join比较几乎一样的例子,只是改了改变量名,所以这里还是用书上X,A,B为准,简单好记。
题目先给出两个表:
表1 表2
X A 以及 X B
1 a 2 x
4 d 5 v
2 b 3 y
问下列哪个代码能输出这样的结果:
X A B
1 a
2 b x
3 y
4 d
5 v
很显然,这是一个在data step里可以用merge来实现的输出,本来考点应该是这种merge等同于SQL里加了coalesce选项的full join.
但是,这里有一点很让人纠结,与prep guide上不同的地方在于考题里的原表不是严格排序!
可以看到X是按1,4,2 或者2,5,3来给的,而我们知道,如果不用order by X, 那么SQL按理是不会按照最后结果X从1到5这么输出,
按楼主的理解,答案中给的
title ’Table Merged’;
select coalesce(One.x, Two.x)
as X, a, b
from One
full join
Two
on One.x = Two.x;
应该是1, 4, 2, 5, 3这么来填:
X A B
1 a
4 d
2 b x
5 v
3 y
但再看其他几个备选答案,一个是select One.x配合left join不予考虑,一个是set a; set b;的写法搞成了one to one reading,还剩下一个干扰选项是:
data merged;
set One Two;
BY X;
run;
Proc print data = merger noobs;
run;
楼主想了很久,觉得有这个BY X能满足排序后的输出结果,但是,因为原来的表并没有对X排序,这么直接用BY到底行不行?
斗争了很久,我还是没选这个而选了有full join带coalesce那个。
最后结果虽然表明我蒙对了,但这题一直是存疑的。