生成员工的层次结构

时间:2013-06-04 18:54:25

标签: sql-server sql-server-2008

我有两个表:EmployeeMasterEmployeeDetails。两者的架构如下: enter image description here

显示两个表中的样本数据:

enter image description here

enter image description here

我想主要使用EmployeeDetails表生成层次结构。该表包含一个名为:Manager的列。需要从表EmployeeId表中选择管理器的EmployeeMaster

这就是层次结构需要形成的方式。 EmployeeId作为参数传递给存储过程。需要挑选该员工的两名主管,并且需要挑选该员工以下的10名员工。

例如,我将Josh.Berkus的EmployeeId传递给存储过程。存储过程查询应返回层次结构,如下所示:

enter image description here

我想要这种格式的最终​​输出:

Employee_Id .... Manager_Id

----------- .... ------------

请注意,Manager_Id是Manager的EmployeeId。

我尝试使用带有union all查询的CTE,但无法正确获取它。

3 个答案:

答案 0 :(得分:2)

实际上你需要计算出递归性,因为经理可以有经理...... 看看:

问题在于你需要2个查询......一个是“升级”层次结构而另一个是关闭...然后结合结果...

为什么不合并这两个表,因为一个人不能拥有2个经理吗?!?特别是因为经理也是一名员工......这将简化一切......

答案 1 :(得分:1)

您可以使用CROSS JOIN在所有记录之间创建链接,然后您可以将条件设​​置为仅选择具有 manager-employee 的列他们之间的关系。

代码应该是这样的:

SELECT 
    ed.employeeid 'Employee ID',
    em.employeeid 'Manager ID', 
FROM EMPLOYEEMASTER em CROSS JOIN EMPLOYEEDETAILS ed
WHERE ed.manager = em.username

答案 2 :(得分:1)

您需要在此处实现一些递归才能获得完整的层次结构。

这是一个快速而又脏的示例,说明如何实现此目标以获取管理器层次结构。对于较低级别的层次结构,您也需要类似的东西

create function dbo.GetManagerHierarchy
( 
@EmpID int
)
returns varchar(100)
as
begin
declare @result varchar(100)
declare @managerId int

SET @managerId = (select top 1 Manager from EmployeeDetails where EMployeeId)
if @managerId is not null then
   SET @result = dbo.GetManagerHierarchy(@managerID) + '-' +  CONVERT(varchar(100), @managerId) + 
else 
   SET @result = ''   

return @result 

end