2016-04-24 41 views
0
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> 25的所有元組。有沒有辦法只顯示示例中的代碼返回的計數結果?SQL - 使用count只計算選擇的值

回答

0

嘗試是這樣的

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的所有行的行didnt與表T2相匹配。

0

可能是因爲當您將s.id換成count(*)時,您將使except語句無效。我認爲你應該能夠將你的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;