Sql 返回计数()的最小值()

Sql 返回计数()的最小值(),sql,ms-access,count,min,Sql,Ms Access,Count,Min,我正在学习SQL测试,上一年的最后一个问题是: 说出学习论文最少的学生的名字。有多少 他们研究过哪些论文 到目前为止,这是我创建的select查询: select min(Full_Name), min(Amount) from (select st.ST_F_Name & ' ' & st.ST_L_Name as Full_Name, count(*) as Amount from (student_course as sc inner join students as s

我正在学习SQL测试,上一年的最后一个问题是:

说出学习论文最少的学生的名字。有多少 他们研究过哪些论文

到目前为止,这是我创建的select查询:

select min(Full_Name), min(Amount) 
from (select st.ST_F_Name & ' ' & st.ST_L_Name as Full_Name, count(*) as Amount
from (student_course as sc
inner join students as st
on st.ST_ID=sc.SC_ST_ID)
group by st.ST_F_Name & ' ' & st.ST_L_Name)
这非常适合于返回我想要的结果,但我不确定这是否是我应该执行此查询的方式?我觉得在某些情况下,用全名称呼敏可能会适得其反。有没有更好的办法?这是MS Access中的未知原因

您可以按计数*排序,以获得最少论文的学生:

i、 e

如果您还需要研究论文的数量,请连接一个包含最小计数的派生表:

select * from students s
left join (
    select top 1 sc_st_id, count(*)
    from student_course 
    group by sc_st_id
    order by count(*)
) t on t.sc_st_id = s.st_id

如果你只想要一个这样的学生,如果有多个,这可能是最简单的:

select st.ST_F_Name, st.ST_L_Name, count(*) as Amount
from student_course as sc
inner join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
order by Amount ASC LIMIT 1
然而,如果你想找到所有的stuch学生,你可以采用不同的方法。我们使用WITH子句来简化事情,它定义了一个CTE公共表表达式,用于计算每个学生的课程数。然后我们选择学生,他们的人数等于该CTE中的最小人数:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(*) as Amount
from student_course as sc
inner join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
)
select * from per_student 
where amount = (select min(amount) from per_student)
但这个问题的真正诀窍是,可能有一些学生没有参加任何课程。但到目前为止,你永远不会看到这些方法。你想要这样的东西:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(sc.SC_ST_ID) as Amount
from student_course as sc
right outer join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
)
select * from per_student 
where amount = (select min(amount) from per_student)

这是因为在这个例子中只有一个学生返回。但是如果我有多个学生的论文最少怎么办?据我所知,这将只返回一个学生,而不是其他学生。如果有多个,我如何编写它以使它返回所有这些值?有两种可能性:1。在不存在阅读论文数量较高的学生的情况下使用,2。找到最小值并再次将该表与计数联接,以获得具有该计数的学生姓名。不带这两个疑问写起来很烦人。顺便说一句,问题本身有一个矛盾:student和has是单数,have和has是复数。我们希望使用,因为这两种方法都引用了两次带有计数的中间表,因此我们不必编写两次。如果有多个具有最少论文的中间表,则此代码仍然只会给1个学生。我必须稍微修改此代码,以便它与MS Access一起使用,但感谢这一点。With子句在Access中似乎不起同样的作用。@Syzorr是的,这就是我没有将注释作为答案的原因。。。与查询。
with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(sc.SC_ST_ID) as Amount
from student_course as sc
right outer join students as st
on st.ST_ID=sc.SC_ST_ID
group by st.ST_ID
)
select * from per_student 
where amount = (select min(amount) from per_student)