0

我有两张桌子:EmployeeMasterEmployeeDetails。两者的架构如下: 在此处输入图像描述

两个表中的样本数据如下所示:

在此处输入图像描述

在此处输入图像描述

我想EmployeeDetails主要使用表来生成层次结构。此表包含名为:Manager 的列。Manager的EmployeeId需要从 tableEmployeeMaster表中选取。

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

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

在此处输入图像描述

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

Employee_Id .... Manager_Id

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

请注意,Manager_Id 是经理的 EmployeeId。

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

4

3 回答 3

2

实际上,您需要计算递归性,因为在 manager 上可以有一个 manager...
看看:

问题是您将需要 2 个查询......一个去“向上”层次结构,一个去向下......然后合并结果......

你为什么不合并两张表,因为一个人不能有2个经理,对吧?!?特别是因为经理也是雇员……这将简化一切……

于 2013-06-04T19:20:16.310 回答
1

您可以使用 aCROSS JOIN在所有记录之间创建链接,然后您可以设置条件以仅选择那些在它们之间具有经理-雇员关系的列。

代码应该是这样的:

SELECT 
    ed.employeeid 'Employee ID',
    em.employeeid 'Manager ID', 
FROM EMPLOYEEMASTER em CROSS JOIN EMPLOYEEDETAILS ed
WHERE ed.manager = em.username
于 2013-06-04T19:14:51.720 回答
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
于 2013-06-05T10:27:46.457 回答