У меня проблемы с домашним заданием:
Найдите все кафедры с большим количеством профессоров, чем студентов.
Включены следующие таблицы:
Table "university.prof"
Column | Type | Modifiers
-----------+-----------------------+-----------
pnum | character(9) | not null
lastname | character varying(12) | not null
firstname | character varying(12) |
dept | character(4) |
office | character(6) |
rank | character(1) |
date_emp | date | not null
salary | numeric(8,2) |
manager | character(9) |
Indexes:
"prof_pkey" PRIMARY KEY, btree (pnum)
Table "university.student"
Column | Type | Modifiers
-----------+---------------+-----------
snum | character(9) | not null
lastname | character(12) |
firstname | character(12) |
dept | character(4) |
date_ent | date |
cr_comp | smallint |
gpa | numeric(4,3) |
advisor | character(9) |
Indexes:
"student_pkey" PRIMARY KEY, btree (snum)
Вопрос по существу требует списка значений, где в левой таблице больше строк со значением, чем в правой таблице. Как мне это сделать? Этот запрос не работает:
SET search_path TO university;
SELECT dept
FROM prof
GROUP BY dept
HAVING count(*) > (
SELECT count(*)
FROM student
GROUP BY dept
);
, приводящий к следующей ошибке:
ERROR: more than one row returned by a subquery used as an expression
Этот код также не работает, в результате чего строки не возвращаются (правильный ответ возвращает две строки):
SET search_path TO university;
SELECT prof.dept
FROM prof, student
GROUP BY prof.dept
HAVING count(prof.*) > count(student.*);
Как я должен это сделать? Я не ищу полный ответ, но намекает на то, как структурировать запрос. Я использую PostgreSQL 9.1.3 на Windows 7.
Редактировать: Спасибо за вашу помощь. Правильный ответ таков:
SET search_path TO university;
SELECT prof.dept
FROM prof, student
WHERE prof.dept = student.dept
GROUP BY prof.dept
HAVING count(DISTINCT prof.*) > count(DISTINCT student.*);
Редактировать 2: Есть лучшее решение. Я принял ответ, содержащий это решение.