如何选择没有女性员工的部门

时间:2018-04-09 15:08:57

标签: sql

架构如下:

  

员工: Fname,Lname, Ssn ,性别, Dno
  部门:Dname, Dnumber Mgr_ssn

Dnumber是部门的主要关键,Ssn是员工的主要关键 Dno是引用Dnumber的外键。

我尝试使用此查询解决问题:

SELECT Dnumber, count(ssn) from DEPARTMENT    
INNER JOIN Employee   
ON Dno = Dnumber  
WHERE sex = ALL('M')
GROUP BY Dnumber

我认为使用ALL会选择只有所有男性员工的部门,然后才会应用计数,但是它会选择所有有男性员工的部门,然后对其进行计数。 我在正确的轨道上,似乎我忽略了一些微不足道的东西,但是我们试图查找类似的问题,但没有找到任何信息。

任何针对类似问题的建议或关于我错过的地方的建议都会很棒。

2 个答案:

答案 0 :(得分:1)

这只是尖叫"不存在":

select d.*
from department d
where not exists (select 1 from employee where d.dnumber = e.dno and d.sex = 'F');

顺便提一下,假设所有非女性都是男性,则无法在许多数据库中使用。

您的查询中有多处失误。首先,ALL()适用于子查询中的值列表。它与外部查询没有任何关系。其次,它正在过滤掉WHERE中的所有女性。如果你想计算数字,这很好,但它没有给你任何东西来确定是否有任何女性。

答案 1 :(得分:0)

您可以使用HAVING(假设e.sex被定义为NOT NULL):

SELECT d.dnumber, d.dname
FROM department d
JOIN employee e
  ON e.dno = d.dnumber
GROUP BY d.dnumber, d.name
HAVING COUNT(CASE WHEN e.sex = 'F' THEN 1 END) = 0;