无法弄清楚如何连接表

时间:2017-04-15 10:48:49

标签: mysql sql database

SELECT e.ManagerID, count(*) as NumberOfDepartments From HumanResources.Employee e, Person.Contact c where e.ContactID = c.ContactID group by e.ManagerID;

目标是编写一份报告,以显示该经理的经理人姓名,名字和姓氏以及他们监督的独特不同部门的数量。并且只显示监督大多数部门的经理。 我必须确保所有员工目前都在工作(即enddate不包含日期)。 上面的代码正在显示他运行的managerID和部门的编号,但每当我尝试输入名字和姓氏时,我也必须将它们放在'group by'子句中,这样就可以生成整个报告快要疯了。请帮助。
Database Here

2 个答案:

答案 0 :(得分:1)

在您的架构中,似乎managerID中的Employee列中填充了该员工的经理ID。这可以解释为什么在添加firstNamelastName时,报告会变得疯狂,因为您要按员工的名字进行分组,而不是经理的名称。

在没有看到表格内容的情况下很难说清楚,但您可能会认为管理员可以通过填充managerID而非来识别。

如果是这种情况,您可以像这样编写查询

select  e.EmployeeID, c.firstName, e.lastName, count(distinct edh.DepartmentID)
from    Employee e
join    Contact c
on      e.ContactID = c.ContactID
join    Employee e2
on      e1.EmployeeID = e2.ManagerID
join    EmployeeDepartmentHistory edh
on      e2.EmployeeID = edh.EmployeeID 
where   e.ManagerID is null and edh.EndDate is null
group by e.EmployeeID, c.firstName, e.lastName

Employee表的第一个实例是管理员(因为您设置了where e.ManagerID is null),使用Contact的联接可以获得管理员的名称,Employee的第二个实例获取每个经理管理的所有人员,与EmployeeDepartmentHistory的联接可以获得他们的部门(您指望的)和他们的EndDate,必须是null以确保您他们现在就职了。

修改

请注意我写连接的方式;在from子句中将它们写为逗号分隔的表名称,where中的连接条件为a bad habit that should be kicked,因为它使得读取,维护和更改它们更加难以加入外连接。这就是1992年在SQL语言中引入join的原因。

答案 1 :(得分:1)

在MSSQL中:

SELECT e.ManagerID, e.FirstName, e.LastName, COUNT(*) AS NumberOfDepartments FROM HumanResources.Employee e
INNER JOIN Person.Contact c ON e.ContactID=c.ContactID
GROUP BY e.ManagerID, e.FirstName, e.LastName

如果在MySql中需要它,请将ON更改为WHERE模式,将INNER JOIN更改为JOIN