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

Posted

技术标签:

【中文标题】如何选择没有女性员工的部门【英文标题】:How to select departments with no female employees 【发布时间】:2018-09-19 01:03:53 【问题描述】:

架构如下:

员工: Fname、Lname、Ssn、Sex、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 只会选择所有男性员工的部门,然后应用计数,但它选择了所有男性员工的部门,然后计算他们。 我走在正确的轨道上,似乎我忽略了一些微不足道的事情,但尝试查找类似的问题但没有找到任何信息。

任何指向类似问题的指针或关于我错在哪里的建议都会很棒。

【问题讨论】:

【参考方案1】:

您可以使用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;

【讨论】:

【参考方案2】:

这只是尖叫“不存在”:

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

顺便说一句,假设所有非女性都是男性在许多数据库中是行不通的。

您的查询中有多个错误。首先,ALL() 应用于子查询中的值列表。它与外部查询没有任何关系。其次,它过滤掉了WHERE 中的所有女性。如果您想计算数字,那很好,但它无法确定是否有女性。

【讨论】:

我试图弄清楚为什么 ALL 在这种情况下不起作用。当您说它应用于子查询中的值时,您能澄清一下吗?目前我看到查询的操作如下 - 在 dno = dnumber 和 sex = ALL('M') 的条件下应用内连接,我不确定这是如何工作的,因为它不应该通过给定部门的所有员工的“性别”字段并在看到女性员工时立即返回 false,这意味着它不会将该部门包括在联接中?无论如何感谢回复!我需要调查 !exists too 澄清一下,我认为使用 ALL 不仅会过滤掉所有女性,还会过滤掉任何不满足 ALL 的部门。相反,ALL 似乎什么都不做,并且表现得好像我发生了性关系 = 'M' @丹尼。 . .请注意,这应该比使用 joingroup by 的方法具有更好的性能。

以上是关于如何选择没有女性员工的部门的主要内容,如果未能解决你的问题,请参考以下文章

如何限制表单集中的字段选择?

SQL - oracle - 如何从连接结果中选择特定部门

每个部门只选择一名员工

如何创建此 Select 语句?

如何从动态填充的下拉列表中动态选择一个选项

保存新员工时,选择员工的所属部门无法保存的原因