select s.code, s.id
from subjects s
join courses c on (c.subject = s.id)
group by s.id
having count(*) > 25
except
    select s.code, s.id
    from subjects s
    join courses c on (s.id = c.subject)
    join course_staff cs on (cs.course = c.id);

Это возвращает результат, который я хочу, за исключением того, что строка select s.code, s.id действительно должна быть select s.code, count(*). Я просто использую это как тест. Когда я использую код в примере, я получаю 4 кортежа, как и ожидалось, но когда я выключаю s.id для count(*), я получаю ВСЕ кортежи с count & gt; 25 из предметной таблицы. Есть ли способ ТОЛЬКО отображать результаты подсчета, для которых возвращается код в примере?

0
Najji Muhammed 24 Апр 2016 в 07:18

2 ответа

Лучший ответ

Попробуйте что-то вроде этого

select s.code, count(*)
from subjects s
join courses c on (c.subject = s.id)
left join 
(select s.code, s.id
    from subjects s
    join courses c on (s.id = c.subject)
    join course_staff cs on (cs.course = c.id)) a
on a.code=s.code and a.id = s.id
where a.code is null
group by s.id
having count(*) > 25

Левое соединение двух таблиц (t1, t2) с нулевой проверкой на столбце t2 выберет все строки таблицы t1, где строки не совпадают с таблицей t2.

0
cableload 24 Апр 2016 в 04:46

Возможно, потому, что вы аннулируете свое предложение except при замене s.id на count (*). Я думаю, вы должны каким-то образом включить свое предложение except в сам запрос.

Если я правильно читаю ваш запрос, это должно сработать:

select s.code, count(*)
from subjects s
join courses c on (c.subject = s.id)
where c.id not in (select cs.course from course_staff cs)
group by s.id
having count(*) > 25;
0
karina 24 Апр 2016 в 04:48