楼主: ijackie
983 2

sql的问题 [推广有奖]

  • 0关注
  • 1粉丝

博士生

13%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2730 点
帖子
116
精华
0
在线时间
352 小时
注册时间
2010-4-16
最后登录
2019-11-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
初学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

真心不懂,望指点


二维码

扫码加我 拉你入群

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

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

关键词:sql left join proc sql English Englis sql

沙发
ziyenano 发表于 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;

使用道具

藤椅
pobel 在职认证  发表于 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前面。
  1. data a;
  2. input name $    math;
  3. label name="this is AAAAAAAA";
  4. cards;
  5. a              67
  6. b             78
  7. ;

  8. data  b ;
  9. input name $  english;
  10. label name="this is BBBBB";
  11. cards;
  12. a            89
  13. c            79
  14. ;

  15. proc sql;
  16. create table r1 as
  17. select b.*,a.*
  18. from a right join b
  19. on a.name=b.name;

  20. create table r2 as
  21. select a.*,b.*
  22. from a right join b
  23. on a.name=b.name;

  24. quit;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
ziyenano + 1 + 1 + 1 分析的有道理

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

和谐拯救危机

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 14:56