5

架构:

Student(studentid,name,age)
Course(coursename,dept)
enroll(studentid,coursename,grade)

我需要编写 sql 来查找每个年龄组的学生姓名,其中历史和政治学系的课程成绩最高。

到目前为止,我的尝试是

SELECT 
    name 
FROM 
    student 
GROUP BY age 
HAVING sid IN 
            (
                SELECT 
                    max(grade) 
                FROM 
                    enroll e,enroll e1 
                WHERE 
                    e.studentid = e1.studentid 
                AND e.coursename = (
                                    SELECT coursename FROM course 
                                    WHERE 
                                        dname like '%History%'
                                  ) 
                AND e1.coursename = (
                                    SELECT coursename FROM course 
                                    WHERE 
                                        dname like '%PoliticalScience%'
                                    )
            )
4

2 回答 2

2

您可以使用subquery. 尝试,

SELECT  d.*,
        f.dept,
        e.grade
FROM    student d
        INNER JOIN enroll e
            on d.studentID = e.studentID
        INNER JOIN course f
            ON e.courseName = f.courseName
        INNER JOIN
            (
                SELECT  a.age, c.dept, Max(b.grade) maxGrade
                FROM    student a
                        INNER JOIN enroll b
                            on a.studentID = b.studentID
                        INNER JOIN course c
                            ON b.courseName = c.courseName
                WHERE    c.dept IN ('history','political science')
                GROUP BY a.age, c.dept
            ) topScore
            ON  topscore.age = d.age AND
                topscore.dept = f.dept AND
                topscore.maxGrade = e.grade
于 2012-09-16T05:48:07.480 回答
0

你可以尝试这些方面的东西

select 
    s.name 
from 
    student s, enroll e,
    (
        select 
            s.age as age, e.coursename as coursename, max(e.grade) as grade 
        from 
            student s, course c, enroll e
        where 
            s.studentid = e.studentid 
        and c.coursename = e.coursename 
        and (c.dept = 'history' or c.dept = 'political science') 
        group by s.age, e.coursename
    ) t
where 
    s.studentid = e.studentid 
and s.age = t.age 
and e.grade = t.grade 
and e.coursename = t.coursename
于 2012-09-16T05:30:28.123 回答