SQL,嵌套查询(MS ACCESS)

Posted

技术标签:

【中文标题】SQL,嵌套查询(MS ACCESS)【英文标题】:SQL,Nested Queries (MS ACCESS) 【发布时间】:2017-02-05 10:38:52 【问题描述】:

我正在尝试解决一个问题,但似乎无济于事。我想显示数学成绩低于平均水平的 12 年级学生,而不是显示他们的平均成绩,而是显示他们的数学分数。

我正在使用 msAccess 并怀疑使用嵌套查询是必要的。我使用的字段是名字、姓氏、等级(从 1 到 12)和数学(包含数学标记)

我有这个:

Select first_name,last_name,maths
FROM students
WHERE grade = 12
HAVING ROUND(AVG(maths),1)< maths;

输出:

错误: 您尝试执行的查询不包含指定表达式“first_name”作为聚合函数的一部分

但是,我不知道为什么它会抛出这个错误,即使在从选择中删除我不想做的字段之后它也会像这样重复,因为我需要显示它

【问题讨论】:

请阅读minimal reproducible example并采取行动。给出所有相关的代码、输入、输出、期望的输出和错误信息。 我已经提供了上下文、字段、预期结果和导致问题的代码,我还能添加什么? @philipxy 阅读 HAVING。它与 GROUP BY 一起使用。当没有明确的 GROUP BY 时,就好像您已经编写了某个默认值。由于将表分组为指定列的每个子行值的行组,因此只能从这些列中选择,因为其他列有许多具有不同值的行。 PS如果您提供错误编号和消息,您可能会立即通过谷歌搜索得到答案。 我已经更新了问题,感谢您的输入我会调查它@philipxy MS-Access - you tried to execute a query that does not include the specified aggregate function的可能重复 【参考方案1】:

要获得得分低于平均水平的用户,您可以执行与您类似的查询,但使用group by

select s.student_id, avg(maths) as avg_maths
from students as s
where s.grade = 12
group by s.student_id
having avg(maths) < (select avg(maths) from students where grade = 12);

(注意:这假设您有每个学生的 id,而不是使用名称。)

接下来,您可以通过各种方式获得原始数学成绩。一种简单的方法是使用in

select first_name, last_name, maths
from students
where grade = 12 and
      student_id in (select s.student_id, avg(s.maths) as avg_maths
                     from students as s
                     where s.grade = 12
                     group by s.student_id
                     having avg(maths) < (select avg(maths) from students where grade = 12)
                    );

【讨论】:

以上是关于SQL,嵌套查询(MS ACCESS)的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套查询从表列表/多个表中选择 - MS SQL

MS-Access 中的未嵌套行?

Oracle三层嵌套查询

MS Access 2013 中的嵌套 SQL 联接

MS Access 2007 中的多个联合语句中的嵌套错误

Oracle怎么嵌套查询