全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
6439 3
2013-04-21
sql多个表之间查询
通常的语句就是
proc sql;
select table1.var,table2.var from table1,table2
where table1.anyvar=table2.anyvar;
quit;

其运行机制是什么?

假设现在有如下需求:

data x;
input id;
cards;
1
2
2
2
5
5
3
3
;
run;
data y;
input id1 ticker;
cards;
1 2
1 3
1 3
2 14
2 14
5 4
5 4
3 1
3 2
6 6
;
run;

/*目的:生成一个数据集,包含两个变量,一个为id,一个为ticker,id为x中id唯一值,ticker为y中与x对应的id所对应的唯一的ticker*/

/*生成数据集z结果如下:*/


data z;
input id ticker;
cards;
1 2
1 3
2 14
5 4
3 1
3 2
;
run;



用一个sql步解决的话就是:

/*code:*/
proc sql;
select distinct x.id,y.ticker from x,y
where x.id=y.id1;
quit;

那么上述代码的原理到底是什么?如果没有distinct,我还能说出个一二来,现在distinct在多表之间利用
是怎么来的,想了半天,不知道以下的想法是否正确,望熟悉sql的同学指导一下:

/*以上sql的机制是不是如下:*/

/*step 1:*/
proc sql;
create table z1 as
select x.*,y.* from x,y;
quit; /*from语句起作用,full join*/

/*step 2:*/
proc sql;
create table z2 as
select * from z1
where id=id1;
quit; /*where语句起作用*/

/*step 3:*/
proc sql;
select distinct id,ticker from z2;
quit; /*select语句的作用*/



/*联合上述step 1,2,3就是:*/
proc sql;
select distinct x.id,y.ticker from x,y
where x.id=y.id1;
quit;


所有sql语句是不是都可以如下理解:
先对两个表full join, 然后根据where,或者on,选择full join之后的部分观测,然后再用select选择其中的部分变量?

望高手解惑
附利用data步代码:

proc sort data=x out=x1 nodupkey;
by id;
proc sort data=y out=y1(rename=(id1=id)) nodupkey;
by id1 ticker;
;
data z;
merge x1(in=_1) y1;
if _1;
by id;
run;




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-4-23 04:33:25
记得说 SAS SQL由SAS Optimier来选择最省时间的方法来执行代码,所以代码执行方式是case by case的。
用_method _tree 可以看到SQL是如何执行的
proc sql _method _tree;
select distinct x.id,y.ticker from x,y
where x.id=y.id1;
quit;

Untitled.jpg
从output可以见到SQL先从data x里选择了id,data y 里选择了id1和ticker,再用hash join的方法把两个表join到一块儿(条件是x.id = y.id1),然后保留id和ticker,最后是unique那一步
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-4-23 09:04:10
yuerqieqie 发表于 2013-4-23 04:33
记得说 SAS SQL由SAS Optimier来选择最省时间的方法来执行代码,所以代码执行方式是case by case的。
用_m ...
学习了,_method和_tree的用法挺神奇
为什么是前方加一个下划线,按SAS的特点应该是后面也加一个的啊

我倒是从没想过SQL运行的原理,我发现SAS的Data步较SQL快些
Oracle和SQL Server的SQL表连接也要比SAS的快些
过去最早我是用SAS调Oracle,然后连完了再导回SAS
后来换公司了转为用SQL Server,发现这么用不行,还是用SAS SQL统一做了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-4-26 14:23:09
可以参考一下这个关于SQL各子句执行顺序的图:

http://www.sql.co.il/books/insid ... essing%20Poster.pdf
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群