sql 语句问题求解答

大家哈,问题如下:表A编号姓名科目分数001a语文89001a数学88001a英语87002b语文86002b数学85表B编号姓名科目分数001a语文89001a数学99... 大家哈,问题如下:
表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写出每次考试,各科成绩最高的人
(语文最高的,数学最高的,英语最高的)
展开
 我来答
hujianhua1210
2013-09-05 · 超过11用户采纳过TA的回答
知道答主
回答量:28
采纳率:0%
帮助的人:23.9万
展开全部
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就行。
AWPLP
2013-09-05 · TA获得超过752个赞
知道小有建树答主
回答量:171
采纳率:0%
帮助的人:153万
展开全部
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 编号,姓名,科目
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sun_rain_ice
2013-09-05 · TA获得超过1419个赞
知道小有建树答主
回答量:1286
采纳率:0%
帮助的人:1042万
展开全部

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

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

    已赞过 已踩过<
    你对这个回答的评价是?
    评论 收起
    收起 更多回答(1)
    推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

    为你推荐:

    下载百度知道APP,抢鲜体验
    使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
    扫描二维码下载
    ×

    类别

    我们会通过消息、邮箱等方式尽快将举报结果通知您。

    说明

    0/200

    提交
    取消

    辅 助

    模 式