求教oracle两个表联合查询的sql语句(100)

  • 主题发起人 主题发起人 mumu
  • 开始时间 开始时间
M

mumu

Unregistered / Unconfirmed
GUEST, unregistred user!
求教oracle两个表联合查询的sql语句 两个表,主从表为一对多的关系,即,从表中有一条或多条记录同主表匹配;现在我想只显示从表中同主表匹配的第一条记录(指定从表排序方式),请问查询的SQL语句?例如: 表一为: 姓名编号  姓名 1     N1 2     N2 3     N3 4     N4=====表二为姓名编号 考试科目 成绩N1    语文 99N1    数学 90N1    历史 80N2     语文 99N2     地理 90N3    语文 80N4     语文 88————————————————————查询结果姓名编号 姓名 科目 成绩1    N1 语文 992    N2 语文 993    N3 语文 804    N4 语文 88
 
Select a.*, b.科目, b.成绩from 表一 a, 表二 b, (select b.姓名编号, Min(b.RowID) RowID_ from 表二 b, 表一 a where b.姓名编号=a.姓名编号 group by b.姓名编号 )CWhere A.姓名编号=C.姓名编号 And B.RowID=C.RowID_
 
select a.*,b.科目,b.成绩 From 表一 a,(select distinct 姓名编号,科目,max(成绩)成绩 From 表二 b where b.姓名编号=a.姓名(+)) bwhere a.姓名=b.姓名编号
 
select c.姓名编号, c.姓名, c.考试科目, c.成绩, min(Rank) from (SELECT h.姓名编号, h.姓名, l.考试科目, l.成绩, Dense_Rank() Over(ORDER BY l.姓名编号, l.考试科目, l.成绩) Rank /* ORDER BY后面是排序字段*/ FROM 表二 l, 表一 h where h.姓名编号 = l.姓名编号) C group by c.姓名编号, c.姓名, c.考试科目, c.成绩
 
  非常感谢各位的解答,收益多多!  有朋友给了下面的答案,我觉得也挺不错的————select * from (select a.姓名编号,a.姓名,b.考试科目 as 科目,b.成绩, row_number()over(partition by a.姓名 order by b.成绩 desc) as id  from 表一 a,表二 b where a.姓名=b.姓名) where id = 1;说明:  1、上面的sql是按照成绩降序排列后取出每个姓名的第一条记录,如果想换成升序把【order by b.成绩 desc】改成【order by b.成绩】即可。  2、如果想取第二条记录把【where id = 1;】改成【where id = 2;】即可。  3、如果想去前n条把【where id = 1;】改成【where id <=n;】即可。————————————————————  深切感到,进行数据库相关开发,必须对数据库有尽可能多的学习和了解啊!!  有时候,在数据库端一些比较好的SQL语句胜过前端上百行费尽心机的编码啊!!   
 
后退
顶部