在一个部门的所有项目中工作的员工
Posted
技术标签:
【中文标题】在一个部门的所有项目中工作的员工【英文标题】:Employees working in all projects of a department 【发布时间】:2018-08-31 13:43:18 【问题描述】:这是我的数据库:
员工(id、department_id、姓名) 部门(id,名称) 项目(id, departament_id) 工作(employee_id、project_id)使用PK,FK(例如:Employee 有来自 Department 的 PK id 和 FK departament_id (id))
我想选择在某个部门(例如开发)的所有项目中工作的所有员工(E.name)。
这是我的查询:
SELECT E.name,
COUNT(P.id) AS PW,
AVG(DISTINCT(Q.allproj)) AS PrjOfDep
FROM Employee E
JOIN WORK W
ON W.employee_id= E.id
JOIN Project P
ON P.id = W.project_id
JOIN (SELECT D.id,
COUNT(P1.id) AS allproj
FROM Project P1
JOIN Department D
ON P1.departament_id = D.id
AND D.name = "Development"
GROUP BY D.id) Q ON P.departament_id = Q.id
GROUP BY E.ID HAVING PW = PrjOfDep
这有点工作,这是结果:
Name PW PrjOfDep
Stark 2 2.0000
Mike 2 2.0000
我不知道如何检查员工E正在工作的所有项目是否包括部门“开发”的所有项目,所以我做了一个技巧,我的查询看起来很丑陋。我统计了员工 E 在开发部门工作的所有项目,并将其与部门“开发”的项目数量进行了比较。
PrjOfDep 是一个平均值,我做了这个丑陋的把戏,因为查询
SELECT E.name,
COUNT(P.id) AS PW
FROM Employee E
JOIN WORK W
ON W.employee_id = E.id
JOIN Project P
ON P.id= W.project_id
JOIN (SELECT D.id,
COUNT(P1.id) AS allproj
FROM Project P1
JOIN Department D
ON P1.departament_id= D.id
AND D.name = "Development"
GROUP BY D.id) Q
ON P.departament_id= Q.id
GROUP BY E.id HAVING PW = Q.allproj
给我错误:
1054 - Unknown column 'Q.allproj' in 'having clause'
我想对我的问题进行更优雅的查询,并且我只想查看员工的姓名。谢谢!
【问题讨论】:
什么是 dnr 和 pnr? 部门表和项目表的主键 能否提供一些示例数据 首先... launchbylunch.com/posts/2014/Feb/16/sql-naming-conventions .. 使用命名约定。为您和任何人命名,可以帮助您在忘记所做的任何事情后理解您的代码。 好的,我会尝试更新我的问题。 【参考方案1】:您的尝试似乎比您所要求的要多得多。如果你的问题只是如何
选择在某个部门(例如开发)的所有项目中工作的所有员工(E.name)。
然后类似以下的东西应该可以工作:
SELECT e.name
FROM Employee e
INNER JOIN Work w ON e.eid = w.eid
INNER JOIN Project p ON w.pid = p.pid
INNER JOIN Department d ON p.did = d.did
WHERE d.Deptname = "Development"
GROUP BY e.name
HAVING COUNT(p.Projname) = (SELECT count(p.Projname)
FROM Department d
INNER JOIN Project p ON d.did = p.did
WHERE d.Deptname = "Development")
演示:SQL Fiddle
【讨论】:
优秀的网站,谢谢!我还有一个问题:所有的连接在sql中都是可交换的?INNER
加入的顺序无关紧要。这是因为内部联接只查找两个表中都存在的数据。不过,顺序对于OUTER
连接确实很重要,并且您的查询将返回不同的结果。有关更多信息,请参阅此处接受的答案:***.com/questions/9614922/…
嗯,您的查询很简单,但我想查看在某个部门的所有项目中工作的员工。您的查询似乎返回了在某个部门的任何项目中工作的员工
@4vol 我已经编辑了我的解决方案。以上工作,但我怀疑它可以被简化。我会继续测试这个解决方案,看看是否可以进一步改进。
Piccini - 谢谢,我刚刚测试了你的代码,它可以工作。我很好奇是否还有其他解决方案比这更清晰、更优雅。【参考方案2】:
这是我的解决方案
SELECT
EMP.*
FROM Employee EMP
JOIN Department DEP
ON 1 = 1
AND DEP.did = EMP.did
WHERE 1 = 1
AND DEP.Deptname = 'Development'
AND EMP.eid NOT IN(
SELECT DISTINCT
DEPEMP.eid
FROM Employee DEPEMP
JOIN Project PRO
ON 1 = 1
AND PRO.did = DEPEMP.did
LEFT JOIN Work WRK
ON 1 = 1
AND WRK.eid = DEPEMP.eid
AND WRK.pid = PRO.pid
WHERE 1 = 1
AND DEPEMP.did = DEP.did
AND WRK.eid IS NULL
);
遗憾的是,解决方案并不那么优雅。 试试看here
【讨论】:
"ON 1=1", "WHERE 1=1"...我不太明白你在那里做了什么 您可以完全忽略这些。我只是喜欢用 AND 链接条件。所以只需擦除 1 = 1 AND。查询将保持不变。 好的,但是您的代码不起作用。看这里:sqlfiddle.com/#!9/b79498/1 是的,我的错。懒得正确测试它。我再试一次。 我修复了我的解决方案,现在它应该为你工作了。以上是关于在一个部门的所有项目中工作的员工的主要内容,如果未能解决你的问题,请参考以下文章
如何创建在 Visual Studio Code 中工作的 Java / Maven 项目?