架构如下:
员工: 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会选择只有所有男性员工的部门,然后才会应用计数,但是它会选择所有有男性员工的部门,然后对其进行计数。 我在正确的轨道上,似乎我忽略了一些微不足道的东西,但是我们试图查找类似的问题,但没有找到任何信息。
任何针对类似问题的建议或关于我错过的地方的建议都会很棒。
答案 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;