简单的SQL,无需使用子查询即可返回计数

时间:2009-04-08 09:21:30

标签: sql postgresql

我试图通过单个SQL语句获取注册课程的学生人数,但不使用子查询。到目前为止,我只能弄清楚如何使用子查询来做到这一点。还有另一种方式吗?

考虑以下数据库设置:

create table student (id integer not null primary key);
create table course_enrolment (student integer not null references student, course integer not null);
insert into student values (1);
insert into student values (2);
insert into student values (3);
insert into course_enrolment values (2,20);
insert into course_enrolment values (2,30);
insert into course_enrolment values (3,10);

我想获得参加课程的学生人数。在这种情况下,它是2。

我可以使用子查询轻松实现这一目标:

  

SELECT COUNT(*)FROM(从COURSE_ENROLMENT选择DISTINCT学生)作为数据;

我想在不使用子查询的情况下获取计数。

我正在使用Postgresql 8.3,但我正在寻找与供应商无关的解决方案。

7 个答案:

答案 0 :(得分:8)

这个怎么样:

SELECT  course, COUNT(DISTINCT student)
FROM    course_enrolment
GROUP BY course

这为学生提供了每门课程。如果您只想要在任何课程上注册的总人数:

SELECT  COUNT(DISTINCT student)
FROM    course_enrolment

我认为这是所有ANSI标准的SQL,所以应该在大多数地方工作。

答案 1 :(得分:2)

我不知道postgres,但是在SQL Server上:

SELECT COUNT(DISTINCT STUDENT) FROM COURSE_ENROLMENT

答案 2 :(得分:2)

我对Postgresql了解不多,但我就是这样做的MS SQL Server ......

select count(distinct student)
From course_enrolment

答案 3 :(得分:1)

SELECT COUNT(DISTINCT STUDENT) FROM COURSE_ENROLMENT

答案 4 :(得分:1)

这是为了选择学生:

select course, count(*) as students 
from course_enrolment
group by course

这只是为了计算学生(希望不是特定的SQL Server特定的)

select count(distinct student) from course_enrolment

答案 5 :(得分:1)

真正的问题是你为什么不想使用子查询?

一般来说,每个人都以正确的方式回答:

select count(distinct student) from course_enrolment

但是对于大量的学生/课程来说,8.4之前的PostgreSQL中的这种类型的查询会很慢。更快的方法是:

select count(*) from (select student from course_enrolment group by student);

但它使用子查询 - 由于某种原因,你不需要。

答案 6 :(得分:0)

select COUNT(distinct student) from course_enrolment