日期:2014-05-17  浏览次数:20692 次

关于一对多的表的查询语句
假如我有表A,存储学生学号,姓名,家庭住址,联系电话等信息
另有表B,存储学生学号,课程号,成绩等信息

现在我想得出如下数据形式
学生姓名,课程号,成绩

那么就需要A,B表连接,我这样写
select a.姓名,b.课程号,b.成绩
from A,B
where a.学号 = b.学号;
结果同一个学生姓名,因为有多个成绩,所以有多个行

可是,我又想只要第一行,其他行不要,这样要怎么写sql语句呢?请给完整的sql哦
------解决方案--------------------
如果使用sql*plus
break on 姓名

select a.姓名,b.课程号,b.成绩
from A,B
where a.学号 = b.学号
order by 姓名;

使用其他工具的话,我就不清楚了
------解决方案--------------------
select distinct a.姓名,b.课程号,b.成绩
from A,B
where a.学号 = b.学号
------解决方案--------------------
select c.姓名,c.课程号,c.成绩
from
(
select a.姓名,b.课程号,b.成绩,row_number() over (partition by a.姓名 order by a.姓名,b.课程号) nm
from a,b
where a.学号=b.学号
) c
where nm=1
------解决方案--------------------
引用:
select c.姓名,c.课程号,c.成绩
from
(
select a.姓名,b.课程号,b.成绩,row_number() over (partition by a.姓名 order by a.姓名,b.课程号) nm
from a,b
where a.学号=b.学号
) c
where nm=1

这个是正解。还是行转列的问题。。呵呵。
------解决方案--------------------
为什么现在的LZ都喜欢用女孩做头像,难道更容易获得答复么... 程序员都挺孤独寂寞冷的,所以更需要优先回答女性的问题吧...


行转列,一维转多维   居家必备 MAX(CASE WHEN THEN ELSE END) AS 成绩1
                          MAX(CASE WHEN THEN ELSE END) AS 成绩2