SQL查询需要改进

时间:2018-02-02 16:02:19

标签: sql oracle11g

我想获得FIRSTNAME的{​​{1}}和LASTNAME,这些已经在2010年之后开始,并且所有学科的平均成绩都高于5.50。年份为整数(4)成绩道具为 - null(尚未完成),0(未参加考试)和2,3,4,5,6。

数据库:Oracle

我在尝试的是:对于每个STUDENT大于2010年的学生,获得他的成绩的平均值,除了那些为零或零的成绩。

我尝试过的代码:

YEARSATART

我猜我的查询错了,因为我看不到正确的结果。您对改进/修复有什么想法吗?哪里可能是我的错?我觉得我得到了所有年级的平均分,而不是每个学生分别

2 个答案:

答案 0 :(得分:2)

我认为你只是错过了subselect的位置。您需要在Studentst = Student.StudentID:

的classstudent上进行过滤
SELECT DISTINCT FIRSTNAME, LASTNAME FROM PERSON  
JOIN STUDENT ON PERSON.PERSONID = STUDENT.STUDENTID 
JOIN CLASSSTUDENT ON STUDENT.STUDENTID = CLASSSTUDENT.STUDENTID
WHERE STUDENT.YEARSTART > 2010
AND (SELECT AVG(FINALGRADE) 
    FROM CLASSSTUDENT
    WHERE FINALGRADE IS NOT NULL 
    AND FINALGRADE > 1
    AND STUDENTID=STUDENT.STUDENTID) >= 4.50;

答案 1 :(得分:0)

您需要将嵌套查询加入外部查询,最好将alias设置为每个表以允许消除歧义。此外,您不需要CLASSSTUDENT主查询:

SELECT DISTINCT FIRSTNAME, LASTNAME 
FROM PERSON  
JOIN STUDENT S ON PERSON.PERSONID = S.STUDENTID 
WHERE STUDENT.YEARSTART > 2010
AND (SELECT AVG(FINALGRADE) 
        FROM CLASSSTUDENT C
        WHERE C.STUDENTID = S.STUDENTID
        AND FINALGRADE > 1) >= 4.50;

在嵌套查询中也不是null,因为聚合函数不计算空值。