2012-09-16 61 views
5

架構:如何做到這一點的SQL查詢?

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%' 
            ) 
      ) 
+0

你如何定義年齡組? – vikiiii

+0

我的猜測是年齡組指向同一年齡段的學生,因此按年齡分組。 – user1675198

回答

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 
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