Oracle上的SQL:已经加入了两个表,现在我想要另一个表中的另一个列(另一个连接)

时间:2017-09-15 18:31:04

标签: sql oracle11g inner-join

我有三张桌子; 1.学生 - 身份证,姓名 2.主题 - sid,sname 3.结果 - id,sid,标记(id和sid是上面两个表引用的外键)

现在,我执行

SELECT s.sname AS SubjectName, MAX(r.marks) AS MaxMarks
FROM subjects s, results r
WHERE s.sid=r.sid
GROUP BY r.sid, s.sname
ORDER BY r.sid

我得到了主题名称,其中包含了最高分。 现在进一步说,我还想要得到这些最高分的学生姓名。

所以我尝试添加列r.id,没有用。我尝试在此查询中添加表格学生。在添加表格之后,我可能会对分组感兴趣吗?

我做了这个

SELECT r.id AS StudentID, s.sname AS SubjectName, MAX(r.marks) AS MaxMarks
FROM subjects s, results r
WHERE s.sid=r.sid
GROUP BY r.sid, s.sname, r.id
ORDER BY r.sid

我得到了每个学生ID,重复的科目和得分。 而我基本上想要的是在每个科目中得分最高的学生。

2 个答案:

答案 0 :(得分:0)

你可以简单地添加新的连接,我建议你使用显式连接sintax

SELECT t.name, s.sname AS SubjectName, MAX(r.marks) AS MaxMarks
FROM subjects s
INNER JOIN  results r ON  s.sid=r.sid
INNER JOIN  Students t ON t.id = r.id
GROUP BY r.sid, s.sname, t.name
ORDER BY r.sid

在隐式连接中,sintax应该是

  SELECT s.sname AS SubjectName, MAX(r.marks) AS MaxMarks
  FROM subjects s, results r, stundet t
  WHERE s.sid=r.sid
  and t.id = r.id 
  GROUP BY r.sid, s.sname, t.name
  ORDER BY r.sid

答案 1 :(得分:0)

您可以使用ROW_NUMBER()标记在每个主题上标记最高的学生

SELECT st.name,
       sj.sname,
       r.marks
  FROM (SELECT id,
               sid,
               marks,
               ROW_NUMBER() OVER (PARTITION BY sid 
                                      ORDER BY marks DESC) maxmarks
          FROM results) r
  JOIN students st
    ON r.id = st.id
  JOIN subjects sj
    ON r.sid = sj.sid
 WHERE r.maxmarks = 1