|
|
楼主

楼主 |
发表于 2010-11-17 14:03:38
|
只看该作者
跟crackman做sas adv认证试题(8)
From crackman's blog on Baidu
<p><font size="4" face="宋体">Given the SAS data sets: <br>
<br>
WORK.ONE WORK.TWO <br>
<br>
Id Name Id Salary <br>
--- ------ --- ------ <br>
112 Smith 243 150000 <br>
243 Wei 355 45000 <br>
457 Jones 523 75000 <br>
<br>
The following SAS program is submitted:<br>
<br>
data WORK.COMBINE; <br>
merge WORK.ONE WORK.TWO; <br>
by Id; <br>
run; <br>
<br>
Which SQL procedure statement produces <br>
the same results? </font></p>
<p><br>
<font size="4" face="宋体">A.<br>
create table WORK.COMBINE as <br>
select <br>
Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE <br>
full join <br>
WORK.TWO <br>
on ONE.Id=TWO.Id<br>
; <br>
<br>
B.<br>
create table WORK.COMBINE as <br>
select <br>
coalesce(ONE.Id, TWO.Id) as Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE, <br>
WORK.TWO <br>
where ONE.Id=TWO.Id <br>
; <br>
<br>
C.<br>
create table WORK.COMBINE as <br>
select <br>
coalesce(ONE.Id, TWO.Id) as Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE <br>
full join <br>
WORK.TWO <br>
on ONE.Id=TWO.Id<br>
order by Id <br>
; <br>
<br>
D.<br>
create table WORK.COMBINE as <br>
select <br>
coalesce(ONE.Id, TWO.Id) as Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE, <br>
WORK.TWO <br>
where ONE.Id=TWO.Id <br>
order by ONE.Id <br>
; </font></p>
<p><font size="4" face="宋体">答案是:C</font></p>
<p><font size="4" face="宋体">本文属于博客:</font><a href="http://hi.baidu.com/crack_man/home"><font size="4" face="宋体"><!-- m --><a class="postlink" href="http://hi.baidu.com/crack_man/home">http://hi.baidu.com/crack_man/home</a><!-- m --></font></a><font size="4" face="宋体"> 版权归作者所有,欢迎转载!如有转载,请务必注明出处!未经本文作者同意不得用于商业应用。</font></p>
<p><font size="4" face="宋体">本道题考察的MERGE SQL在横向水平上合并数据集上的区别。<br>
可以参见两篇文章:<br>
</font><a href="http://hi.baidu.com/crack_man/blog/item/16acc5bbfa88ce1a18d81f76.html"><font size="4" face="宋体"><!-- m --><a class="postlink" href="http://hi.baidu.com/crack_man/blog/item/16acc5bbfa88ce1a18d81f76.html">http://hi.baidu.com/crack_man/blog/item ... 81f76.html</a><!-- m --></font></a><br>
<a href="http://hi.baidu.com/crack_man/blog/item/c4cf52b1ef327ec137d3ca84.html"><font size="4" face="宋体"><!-- m --><a class="postlink" href="http://hi.baidu.com/crack_man/blog/item/c4cf52b1ef327ec137d3ca84.html">http://hi.baidu.com/crack_man/blog/item ... 3ca84.html</a><!-- m --></font></a><br>
<font size="4" face="宋体">下面对四个答案进行解析。<br>
A:<br>
犯了一个明显的错误,就是ID这个变量引用不明确。<br>
B:<br>
返回只有一个观测,因为ONE和TWO的连接按照ON筛选条件进行了筛选,结果只有一条符合条件。<br>
C:<br>
首先执行的是按照ON条件执行FULL JOIN链接,此时如果不用COALESCE,数据集会有两个ID,一个是ONE 一个是TWO的,如果ONE和TWO的ID不匹配,那么想要的ID就为缺失值。<br>
那么COALESCE函数就是合并这两个ID,然后重复的合并在一起,剔除缺失值,所以结果就和MERGE一致。<br>
D:<br>
错误和B一样,连接方式不是FULL JOIN,而是inner join。</font></p>
<p><font size="4" face="宋体">示例程序:</font></p>
<p><font size="4" face="宋体">data one;<br>
input id name $@;<br>
datalines;<br>
112 smith<br>
243 wei<br>
457 jones<br>
;<br>
data two;<br>
input id salary@;<br>
datalines;<br>
243 150000<br>
355 45000<br>
523 75000<br>
;<br>
run;<br>
data WORK.COMBINE; <br>
merge WORK.ONE WORK.TWO; <br>
by Id; <br>
run; <br>
proc sql;<br>
create table WORK.COMBINE1 as <br>
select <br>
Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE <br>
full join <br>
WORK.TWO <br>
on ONE.Id=TWO.Id<br>
; <br>
create table WORK.COMBINE2 as <br>
select <br>
coalesce(ONE.Id, TWO.Id) as Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE, <br>
WORK.TWO <br>
where ONE.Id=TWO.Id <br>
; <br>
create table WORK.COMBINE3 as <br>
select <br>
coalesce(ONE.Id, TWO.Id) as Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE <br>
full join <br>
WORK.TWO <br>
on ONE.Id=TWO.Id<br>
order by Id <br>
; <br>
create table WORK.COMBINE4 as <br>
select <br>
coalesce(ONE.Id, TWO.Id) as Id, <br>
Name, <br>
Salary <br>
from <br>
WORK.ONE, <br>
WORK.TWO <br>
where ONE.Id=TWO.Id <br>
order by ONE.Id <br>
; </font></p>
<p><font size="4" face="宋体">quit; <br>
</font></p> <a href="http://hi.baidu.com/crack%5Fman/blog/item/5ca446c6e28c0c25e4dd3b93.html">阅读全文</a>
<br/><b>类别:</b><a href="http://hi.baidu.com/crack%5Fman/blog/category/%B8%FAcrackman%D7%F6sas%20adv%C8%CF%D6%A4%CA%D4%CC%E2">跟crackman做sas adv认证试题</a> <a href="http://hi.baidu.com/crack%5Fman/blog/item/5ca446c6e28c0c25e4dd3b93.html#comment">查看评论</a> |
|