2017-02-24 73 views
0

在以下Oracle語句中,我使用子查詢來獲取最終記錄。在最終結果中獲取/顯示嵌套的子查詢列名

這個查詢工作正常,但我想使它更優化。這裏,在嵌套的子查詢(即第三段)中,我得到了avg,max和min。不管我在嵌套的子查詢中得到什麼結果(即第三段)再次我在第二段查詢中使用那些列名,同樣,我在第一段查詢中使用相同的列名(avg,max和min)來顯示我的最終結果結果。是否有任何最佳方式,以便我可以直接在第一個查詢(第一個段查詢)中使用列名(avg,max和min)。

select suq1.class_id, course.name, suq1.max_score, suq1.min_score, suq1.avg_score 
from course, 
(select class.course_id as course_id, subq.class_id as class_id, 
     subq.maximum_score as max_score, subq.minimum_score as min_score, 
     subq.Average_Score as avg_score 
    from 
     (select class_id, max(score) as maximum_score, min(score) as minimum_score, 
       avg(score) as Average_Score from grade group by class_id) subq,  
    class where subq.class_id=class.class_id) suq1 
where suq1.course_id=course.course_id; 
+0

我剛剛編輯你的代碼和(雖然這樣做)試圖閱讀和理解它,我仍然沒有看到它應該做什麼。請用簡單的英語解釋表格是什麼(表名,列名和數據類型,只有與問題相關的表格和列)以及你想從中獲得什麼輸出 - 什麼是邏輯,什麼是邏輯,什麼是邏輯輸出必須具有的列以及它們代表什麼/如何計算。也許這聽起來像很多工作,也許是這樣,但你正在尋找免費的建議 - 你必須做一些工作。 – mathguy

回答

0

我會說答案是否定的,因爲基於查詢的年級表PK是類和表不包括課程。查詢所做的基本上是爲每個課程找到所有的課程,然後計算每個課程的最低/最高/最低等級,然後按照課程進行計算。 - - 如果GRADE表包含課程編號,只要您不需要考慮已停用的課程(上述查詢不需要),就可以跳過閱讀課程表。 - - HTH - 馬克·d·鮑威爾 -

+0

我更喜歡聽到OP的要求。如果你描述的是正確的(我也這麼認爲),那麼:首先,加入應該先完成,然後纔是min/max/avg(他們只需要完成一次)。並且考慮到平均每班的平均數不同於一門課程中所有年級的平均數(因爲並不是所有班級的分數都是相同的)。但我不想給出答案,然後發現OP的要求不同,這就是爲什麼我要求OP進行澄清。 – mathguy

0

如果和類標識碼是COURSE_ID主鍵和名稱是唯一的,這個查詢可能工作.. 但是,如果你有這些表中的海量數據,該查詢可能工作太慢..

SELECT B.CLASS_ID, C.NAME, MAX(B.SCORE), MIN(B.SCORE), AVG(B.SCORE) 
    FROM CLASS A, GRADE B, COURSE C 
WHERE A.CLASS_ID = B.CLASS_ID 
    AND A.COURSE_ID = C.COURSE_ID 
GROUP BY B.CLASS_ID, C.NAME