Простой SQL для возврата счетчика без использования подзапросов - PullRequest
1 голос
/ 08 апреля 2009

Я пытаюсь получить количество студентов, зачисленных на курсы, с помощью одного оператора 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.

Я могу легко добиться этого, используя подзапросы:

ВЫБЕРИТЕ СЧЕТЧИК (*) ИЗ (ВЫБЕРИТЕ РАЗЛИЧНОГО СТУДЕНТА ИЗ КУРСА_ПРОТК) в качестве ДАННЫХ;

Я хочу получить счет без использования подзапроса.

Я использую Postgresql 8.3, но ищу решение, не зависящее от поставщика.

Ответы [ 7 ]

8 голосов
/ 08 апреля 2009

Как насчет этого:

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

Это дает студентам за курс. Если вы просто хотите, чтобы общее количество поступило на любой курс:

SELECT  COUNT(DISTINCT student)
FROM    course_enrolment

Я считаю, что это все стандарт ANSI SQL, поэтому он должен работать в большинстве мест.

2 голосов
/ 08 апреля 2009

Я мало что знаю о Postgresql, но так я бы это сделал, MS SQL Server ...

select count(distinct student)
From course_enrolment
2 голосов
/ 08 апреля 2009

Я не знаю о postgres, но на SQL Server:

SELECT COUNT(DISTINCT STUDENT) FROM COURSE_ENROLMENT
1 голос
/ 08 апреля 2009

Реальный вопрос: почему вы не хотите использовать подзапрос?

Как правило, все ответили правильно:

select count(distinct student) from course_enrolment

но этот тип запросов в версии до 8.4 PostgreSQL будет медленным для большого числа студентов / курсов. Гораздо более быстрый способ будет:

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

но он использует подзапрос, который по какой-то причине вам не нужен.

1 голос
/ 08 апреля 2009

Выбор студентов по курсу:

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

и это только для подсчета студентов (надеюсь, не для конкретного SQL Server)

select count(distinct student) from course_enrolment
1 голос
/ 08 апреля 2009
SELECT COUNT(DISTINCT STUDENT) FROM COURSE_ENROLMENT
0 голосов
/ 20 февраля 2015
select COUNT(distinct student) from course_enrolment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...