查找从事多个项目的男性员工

find the male employees who works on more than one projects

我有以下架构:

employee(fname,lname,e_no,age,address,sex,slary,dept_number)

dpartment(dept_name,dept_number,dept_location)

project(pname,pnumber,plocation,dept_number)

works_on(e_no,pnumber,hours)

需要找到从事多个工作的男性员工的姓名 project.I 创建了以下 sql 语句。但它不起作用。我的错误是什么以及我该如何解决它?

SELECT `fname`,`lname` 
FROM `employee`,`works_on`
ON`employee.`e_no`=`works_on`.`e_no` 
WHERE `employee`.`sex`='male' 
GROUP BY `employee`.`e_no` 
HAVING COUNT(works_on.e_no)>1;

HAVING 子句中,您应该通过 pnumber 而不是 e_no 进行测试:

SELECT fname, lname
FROM employee
JOIN works_on
ON employee.e_no = works_on.e_no
WHERE employee.sex = 'male' 
GROUP BY fname, lname
HAVING COUNT(DISTINCT works_on.pnumber) > 1;

注意:您应该使用显式连接语法而不是旧式隐式语法。

另一种方法:

select t.fname, t.lname from employee t
where t.sex = 'male' and t.e_no in (select e_no from works_on)

可以在join前进行聚合,这样效率应该更高(sex的条件不是很挑剔):

SELECT * 
FROM employee
WHERE sex = 'male' 
AND e_no IN
 (
   SELECT e_no
   FROM works_on
   GROUP BY e_no
   HAVING COUNT(*) > 1
 ) 

如果(e_no,pnumber)的组合不唯一:

HAVING COUNT(DISTINCT pnumber) > 1