SQL查询需要改进

SQL查询需要改进,sql,oracle11g,Sql,Oracle11g,我正在努力获得学生的名字和姓氏,这两个名字都是在2010年后开始的,所有学科的平均成绩都在5.50以上。年份为整数(4)等级道具为-null(尚未完成)、0(未参加考试)和2,3,4,5,6 数据库:Oracle 我想做的是:对于每个年级超过2010的学生,计算他的平均成绩,除了那些为零或零的成绩 我尝试过的代码: SELECT DISTINCT FIRSTNAME, LASTNAME FROM PERSON JOIN STUDENT ON PERSON.PERSONID = STUDEN

我正在努力获得
学生的
名字
姓氏
,这两个名字都是在2010年后开始的,所有学科的平均成绩都在5.50以上。年份为整数(4)等级道具为-null(尚未完成)、0(未参加考试)和2,3,4,5,6

数据库:Oracle

我想做的是:对于每个
年级超过2010的学生,计算他的平均成绩,除了那些为零或零的成绩

我尝试过的代码:

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) >= 4.50;

我猜我的查询是错误的,因为我没有看到正确的结果。您对改进/修复有什么想法吗?我的错在哪里?我觉得我得到的是所有成绩的平均值,而不是每个学生的平均值

我想你只是在你的子选项中遗漏了一个where。您需要在StudentID=Student的classstudent上进行筛选。StudentID:

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;

我想你只是在你的次选择中遗漏了一个where。您需要在StudentID=Student的classstudent上进行筛选。StudentID:

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;

您需要将嵌套查询连接到外部查询,最好为每个表设置
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;

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

您需要将嵌套查询与外部查询联接起来,最好将
别名设置到每个表中以允许消除歧义。另外,在主查询中不需要
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;

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

对不起,什么不合适?对不起,什么不合适?