全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1257 2
2012-12-05
初学sql,发现一个问题
有两个数据集
a
name     math
a              67
b             78

b
name   english
a             89
c             79

proc sql;
create table l as
select *
from a left join b
on a.name=b.name;


结果是
name     math    english
a             67           89
b            78             .

可是
proc sql;
create table r as
select *
from a right join b
on a.name=b.name;

结果却是
name     math    english
a             67           89
.              .              79

为什么name c成了缺失?

proc sql;
create table l2 as
select *
from b left join a
on a.name=b.name;

这个程序的结果是有c的

a right join b和b left join c不是应该是一样的吗?
我的是sas 9.2

真心不懂,望指点


二维码

扫码加我 拉你入群

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

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

全部回复
2012-12-5 17:09:04
proc sql;
create table r as
select *
from a right join b
on a.name=b.name;
相当于取了b.name ,然后又取了a.name由于重名,所以覆盖了原先的b.name导致name c缺失;
写成这样就没问题了
select b.*,a.math
from a right join b
on a.name=b.name;

二维码

扫码加我 拉你入群

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

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

2012-12-5 19:43:49
ziyenano 发表于 2012-12-5 17:09
proc sql;
create table r as
select *
我有个不同的理解,运行该SQL步时会产生一个警告:

WARNING: Variable name already exists on file WORK.R.

所以我认为 name ‘c’ 不在数据集r中是因为:
1. 因为”select *“,因此结果数据集R中变量的顺序就由from语句中数据集的顺序决定;
2. from语句中a在前,因此a.name已经占据了“name”这个变量名,而到b.name就产生了上面的警告。
3. 如果把select语句改为“select b.*,a.*”,就会有‘c’了,因为b.name走在了a.name前面。
复制代码
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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