2017-09-15 9 views
2

私は3つのテーブルを持っています。 1.学生 - ID、名前 2科目 - sidの、SNAME 3.結果 - ID、SID、マーク今Oracle上のSQL:すでに2つのテーブルを結合しました。別のテーブルの別の列が必要になります(別の結合)

(idと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を持って、マークを獲得しています。 私が基本的に欲しいのは、各科目で最高の得点を得た学生です。

+0

質問を編集し、サンプルデータと希望するrエスコート。 –

+0

また、あなたが試したことと何がその努力で起こったのかを示してください。 –

+0

同様に、私はこれを行うと、私は各科目の学生の名前と彼の最大マークを得ることができます。しかし、件名の列を追加すると、私は上記のように繰り返し結果を得る。 'SELECT t.name、MAX(r.marks)学生Tから は、結果が取得、t.id BY t.id = r.id 基は、t.name' – user1232

答えて

0

あなたはROW_NUMBERを使用することができなければなりません暗黙の参加sintaxで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 

参加するあなたは、単純な新しい参加追加することができる、と私はあなたに、明示的なの使用を提案します各科目の最高点をマークした学生にタグを付けてください。

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

私は必要なものを、鮮やかにしますか? – user1232

+0

この質問を閉じるには、正しい答えをチェックしてください。ありがとうございました。 :) –

0

に)(

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