查找从事多个项目的男性员工
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
我有以下架构:
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