sql 语句问题求解答

大家哈,问题如下:
表A
编号 姓名 科目 分数
001 a 语文 89
001 a 数学 88
001 a 英语 87
002 b 语文 86
002 b 数学 85
表B
编号 姓名 科目 分数
001 a 语文 89
001 a 数学 99
004 d 英语 81
003 c 语文 96
003 c 数学 92
表C
编号 姓名 科目 分数
001 a 语文 97
005 e 数学 93
004 d 英语 91
以上表是三次模拟考试参考人员的分数和科目
表A和表B C姓名有重复的,也有不重复的(有缺考的)
用一个sql写出ABC三个表所有的参考人的姓名(只要参考了都算):
用一个sql写出每次考试,各科成绩最高的人
(语文最高的,数学最高的,英语最高的)

1)三个表所有的参考人的姓名(只要参考了都算):
--Union本身就会把字段去重,所以不需要distinct,如下:
select 姓名
from a
union
select 姓名
from b
union
select 姓名
from c;
--如果用Union all,则:
select distinct 姓名
from (select 姓名
from a
union all
select 姓名
from b
union all
select 姓名 from c);

2)每次考试,各科成绩最高的人:
select 编号,
姓名,
科目,
分数
from (select 编号,
姓名,
科目,
分数,
row_number() over(partition by 科目 order by 分数 desc) rk -- 在每一科目中,把所有的分数按降序排列,如有两个人同一科目分数一样,则随机取一人
from (select *
from a
union all
select *
from b
union all
select *
from c)
group by 编号,
姓名,
科目,
分数)
where rk = 1 --取分数最高的学生的明细
order by 编号;
注:若两个人同一科目的分数一样且都是最高的,如果想把二人都取出来,那把row_number函数直接替换成dense_number就行。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-05
SQL 1:
SELECT DISRINCT 姓名 FROM A
UNION
SELECT DISRINCT 姓名 FROM B
UNION
SELECT DISRINCT 姓名 FROM C
SQL 2:
SELECT 编号,姓名,科目,MAX(分数)
FROM
(SELECT * FROM A
UNION
SELECT * FROM B
UNION
SELECT * FROM C)
GROUP BY 编号,姓名,科目本回答被提问者和网友采纳
第2个回答  2013-09-05

create view as select * from a union select * from b union select * from c

建议你创建一个三表合并的视图,然后根据视图查询你要的语句,那个都不难