2014-05-22 35 views
0

我在嘗試編寫一個查詢,列出以最大總信用點數註冊的學生。總和查詢的最大值

這裏是我的查詢:

SELECT s.S_ID, 
     s.S_LAST, 
     s.S_FIRST, 
     s."Total Credits" 
FROM 
    (SELECT q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST, 
      sum(q1.CREDITS) "Total Credits" 
    FROM 
    (SELECT COURSE_NO, 
      CREDITS 
     FROM COURSE) q1 
    JOIN 
    (SELECT s.S_ID, 
      s.S_LAST, 
      s.S_FIRST, 
      cs.COURSE_NO 
     FROM STUDENT s 
     JOIN ENROLLMENT e ON s.S_ID = e.S_ID 
     JOIN COURSE_SECTION cs ON e.C_SEC_ID = cs.C_SEC_ID) q2 ON q1.COURSE_NO = q2.COURSE_NO 
    GROUP BY q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST) q3 
GROUP BY s.S_ID, 
     s.S_LAST, 
     s.S_FIRST, 
     s."Total Credits" 
WHERE "Total Credits" = max("Total Credits"); 

這不起作用,我收到此錯誤:

ORA-00933: SQL command not properly ended 
00933. 00000 - "SQL command not properly ended" 
*Cause: 
*Action: 
Error at Line: 23 Column: 1 

任何幫助將不勝感激。

+0

你的外選擇和'q3'不是從's'和你上次'where'條款不正確,您使用的 –

+0

的數據庫?你想要所有學分最高的學生嗎? – Bohemian

+0

這是使用Oracle SQL Developer。是的,我想要所有學分最高的學生,而不僅僅是一個。 – user3664923

回答

0
SELECT q3.S_ID, 
     q3.S_LAST, 
     q3.S_FIRST, 
     max(q3.Total Credits) 
FROM 
    (SELECT q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST, 
      sum(q1.CREDITS) Total Credits 
    FROM 
    (SELECT COURSE_NO, 
      CREDITS 
     FROM COURSE) q1 
    JOIN 
    (SELECT s.S_ID, 
      s.S_LAST, 
      s.S_FIRST, 
      cs.COURSE_NO 
     FROM STUDENT s 
     JOIN ENROLLMENT e ON s.S_ID = e.S_ID 
     JOIN COURSE_SECTION cs ON e.C_SEC_ID = cs.C_SEC_ID) q2 ON q1.COURSE_NO = q2.COURSE_NO 
    GROUP BY q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST) q3 
GROUP BY q3.S_ID, 
     q3.S_LAST, 
     q3.S_FIRST; 
+0

這仍然是不正確的 –

+0

是的,這不起作用,對不起。 – user3664923

+0

有關我如何完成這項工作的任何其他建議? – user3664923

0

您可能希望通過只使用GROUP BY和點心()來解決這個問題,並與ORDER BY和()與限制1或更多,這取決於有多少學生檢索結果你想要的。

這將消除外部子查詢。

0

頑皮的同一個問題的雙重張貼!這是我給你的其他帖子的答案,同樣的東西在這裏仍然適用。

我敢肯定(沒有預言機來測試這一點),你的別名是這個問題:

sum(q1.CREDITS) Total Credits 

應該

sum(q1.CREDITS) "Total Credits" 

也因此

max(q3.Total Credits) 

應該be

max(q3."Total Credits") 

或者你可以擺脫別名中的空間。但是可能還有更多的東西,正如我所說的,我沒有Oracle機器可以方便地測試。

0

刪除所有的「噪音」您的查詢變得

SELECT s.S_ID, s.S_LAST, s.S_FIRST, s."Total Credits" 
FROM 
    (SELECT ... 
    FROM (...) q1 
    JOIN (...) q2 
) q3 
GROUP BY s.S_ID, s.S_LAST, s.S_FIRST, s."Total Credits" 
WHERE "Total Credits" = max("Total Credits"); 

可以很容易地看到,s是不是從你的主查詢可見,同樣在你面對與聚合的詳細WHERE條件,這是不可能(至少不是這樣)

0

如果你一次建立一個查詢,你會注意到,首先,你不需要任何這些內聯視圖。你可以用一個CTE定義和一個子查詢簡單地完成它。

WITH 
student AS 
(SELECT 1 s_id, 'Jones' s_last, 'Sally' s_first FROM dual UNION ALL 
    SELECT 2, 'Smith', 'Pete' FROM dual UNION ALL 
    SELECT 3, 'DeThroned', 'Kate' FROM dual 
), 
enrollment AS 
(SELECT 1 s_id, 10 c_sec_id FROM dual UNION ALL 
    select 1, 11 FROM dual UNION ALL 
    select 2, 11 FROM dual UNION ALL 
    SELECT 3, 12 FROM dual 
), 
course_section AS 
(SELECT 10 c_sec_id, 101 course_no FROM dual UNION ALL 
    SELECT 11, 102 FROM dual UNION ALL 
    SELECT 12, 103 FROM dual 
), 
course AS 
(SELECT 101 course_id, 1 credits FROM dual UNION ALL 
    SELECT 102, 2 FROM dual UNION ALL 
    SELECT 103, 3 FROM dual 
), 
StudentCredit AS 
(SELECT s.s_id, s_last, s_first, sum(c.credits) AS TotalCredits 
    FROM student s 
    JOIN enrollment e 
    ON e.s_id = s.s_id 
    JOIN course_section cs 
    ON cs.c_sec_id = e.c_sec_id 
    JOIN course c 
    ON c.course_id = cs.course_no 
    GROUP BY s.s_id, s_last, s_first 
) 
SELECT * 
FROM StudentCredit 
WHERE TotalCredits = (
      SELECT MAX(TotalCredits) 
      FROM StudentCredit 
     );