簡體   English   中英

Oracle上的SQL:已經聯接了兩個表,現在我想要另一個表中的另一列(另一個聯接)

[英]SQL on Oracle: Already joined two tables, now i want another column from another table(another join)

我有三張桌子。 1.學生-id,名稱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

我得到了每個StudentID,其中包含重復的科目和分數。 而我基本上想要的是在每個學科中得分最高的學生。

您可以簡單地添加新的聯接,我建議您使用顯式聯接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

您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM