我有以下架构:
雇员(FNAME,L-NAME,e_no,年龄,地址,性别,slary,dept_number)
dpartment(DEPT_NAME,dept_number,dept_location)
项目(PNAME,pnumber,plocation,dept_number)
works_on(e_no,pnumber,小时)
需要找到在多个项目上工作的男性员工的名字。我创建了以下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;
答案 0 :(得分:2)
您应该在pnumber
条款中e_no
而不是HAVING
进行测试:
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;
注意:您应该使用显式连接语法而不是旧式隐式语法。
答案 1 :(得分:0)
另一种方法:
select t.fname, t.lname from employee t
where t.sex = 'male' and t.e_no in (select e_no from works_on)
答案 2 :(得分:0)
你可以在加入之前聚合,这应该更有效率(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