我有两个表:EmployeeMaster
和EmployeeDetails
。两者的架构如下:
显示两个表中的样本数据:
我想主要使用EmployeeDetails
表生成层次结构。该表包含一个名为:Manager的列。需要从表EmployeeId
表中选择管理器的EmployeeMaster
。
这就是层次结构需要形成的方式。 EmployeeId作为参数传递给存储过程。需要挑选该员工的两名主管,并且需要挑选该员工以下的10名员工。
例如,我将Josh.Berkus的EmployeeId传递给存储过程。存储过程查询应返回层次结构,如下所示:
我想要这种格式的最终输出:
Employee_Id .... Manager_Id
----------- .... ------------
请注意,Manager_Id是Manager的EmployeeId。
我尝试使用带有union all查询的CTE,但无法正确获取它。
答案 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