如何选择没有女性员工的部门
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' @丹尼。 . .请注意,这应该比使用join
和 group by
的方法具有更好的性能。以上是关于如何选择没有女性员工的部门的主要内容,如果未能解决你的问题,请参考以下文章