HAVING子句的子查询不起作用?

时间:2013-09-19 14:44:17

标签: sql database oracle

我有两个表,一个表示学生的成绩,另一个表示学生的信息,这两个表通过属性STUDENTS.ST_IDGRADES.G_STUDENTS连接。该查询要求我检索所有平均分数高于具有特定STUDENTS.ST_ID_NUM的学生的平均分数(该分数的另一个属性)的学生。我可以将所有学生的评分标记检索为:

SELECT STUDENTS.ST_NAME, STUDENTS.ST_SURNAME, AVG(GRADES.G_GRADE)  
FROM STUDENTS INNER JOIN GRADES  
ON STUDENTS.ST_ID = GRADES.G_STUDENT  
GROUP BY STUDENTS.ST_NAME, STUDENTS.ST_SURNAME;`

以及具有特定STUDENTS.ST_ID_NUM`的特定学生的平均分数:

select avg(grades.g_grade)   
from students inner join grades  
on students.st_id = grades.g_student  
where students.st_id_num = '061RDB121';

如何将条件放在第一个查询上?如果我在HAVING子句中放入另一个子查询则不起作用!我认为内部查询可以工作,但我不知道怎么写它。

3 个答案:

答案 0 :(得分:4)

这样应该有用;

SELECT STUDENTS.ST_NAME, STUDENTS.ST_SURNAME, AVG(GRADES.G_GRADE)
FROM STUDENTS INNER JOIN GRADES
ON STUDENTS.ST_ID = GRADES.G_STUDENT
GROUP BY STUDENTS.ST_NAME, STUDENTS.ST_SURNAME;
having  AVG(GRADES.G_GRADE) > (select avg(grades.g_grade)
                                          from students inner join grades
                                            on students.st_id = grades.g_student
                                            where students.st_id_num = '061RDB121');

答案 1 :(得分:3)

你几乎把这两个放在一起,

SELECT STUDENTS.ST_NAME, STUDENTS.ST_SURNAME, AVG(GRADES.G_GRADE)
FROM STUDENTS INNER JOIN GRADES
ON STUDENTS.ST_ID = GRADES.G_STUDENT
GROUP BY STUDENTS.ST_NAME, STUDENTS.ST_SURNAME
HAVING AVG(GRADES.G_GRADE)>
    (
    select avg(grades.g_grade)
    from students inner join grades
    on students.st_id = grades.g_student
    where students.st_id_num = '061RDB121'
     )

答案 2 :(得分:1)

您是否尝试将两个查询结合使用?

SELECT STUDENTS.ST_NAME, STUDENTS.ST_SURNAME, AVG(GRADES.G_GRADE)
FROM STUDENTS INNER JOIN GRADES
ON STUDENTS.ST_ID = GRADES.G_STUDENT
GROUP BY STUDENTS.ST_NAME, STUDENTS.ST_SURNAME
HAVING AVG(GRADES.G_GRADE) > (
    select avg(grades.g_grade)
    from students inner join grades
    on students.st_id = grades.g_student
    where students.st_id_num = '061RDB121';
);