当前位置: 代码迷 >> Oracle管理 >> 关于Sql多表关联查询有关问题
  详细解决方案

关于Sql多表关联查询有关问题

热度:299   发布时间:2016-04-24 06:21:05.0
关于Sql多表关联查询问题
------------------创建表及插入基础数据----------------------------  
--学生的信息
create table student(sid int,name varchar(20));
--读过的学校
create table shistory(sid int,school varchar(100));
--所有的爱好 
create table shobby(sid int,hobname varchar(200));
commit;
insert into student values(1,'laow'); 
insert into shistory values(1,'新泰某高中');
insert into shistory values(1,'山东某大学') ; 
insert into shobby values(1,'象棋');
insert into shobby values(1,'编程'); 
insert into shobby values(1,'游泳'); 

------------我的关联查询表---------------- 
select a.sid ,name,school, hobname 
from student a , shistory b , shobby c
where a.sid=b.sid and a.sid=c.sid 
order by name
结果:
SID NAME SCHOOL HOBNAME
1 laow 山东某大学 象棋
1 laow 新泰某高中 象棋
1 laow 新泰某高中 游泳
1 laow 新泰某高中 编程
1 laow 山东某大学 游泳
1 laow 山东某大学 编程

我想要的结果是:
SID NAME SCHOOL HOBNAME
1 laow 山东某大学 象棋
1 laow 新泰某高中 游泳
1 laow 空白空白空白 编程
如何实现? 坐等,感谢高手.
注*:School列和Hobname列的顺序无所谓
--删除表
drop table student;
drop table shistory;
drop table shobby;

------解决方案--------------------
SQL code
select a.sid ,name,school, hobname  from student a , shistory b , shobby cwhere a.sid=b.sid(+) and a.sid=c.sid(+)  order by name
------解决方案--------------------
既然楼主是新人
就不要给人家灌输(+)的用法
楼主还是用left join吧,标准易读
select a.sid ,name,school, hobname
from student a 
left join shistory b on a.sid=b.sid
left join shobby c on a.sid=c.sid 
order by name
;
------解决方案--------------------
SQL code
select a.sid ,name,school, hobname  from student a , shistory b , shobby cwhere a.sid=b.sid(+) and a.sid=c.sid(+)  order by name
------解决方案--------------------
SQL code
with b as(select a.*,row_number() over(partition by sid order by 1)  rn from shistory a),c as (select a.*,row_number() over(partition by sid order by 1)  rn from shobby a)select a.sid ,name,school, hobname   from  b  full join  c on b.sid=c.sid  and b.rn=c.rnright join student a on a.sid=nvl(b.sid,c.sid)order by name;
  相关解决方案