我有两个表:EmployeeMaster和EmployeeDetails。两者的模式如下:

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


我想主要使用EmployeeDetails表来生成层次结构。此表包含一个名为: Manager的列。需要从表EmployeeMaster表中选择管理器的EmployeeId。
这就是层次结构需要形成的方式。EmployeeId作为参数传递给存储过程。需要选择该员工的两个主管,并且需要选择该员工资历低于该员工的10个员工。
例如,我将Josh.Berkus的EmployeeId传递给存储过程。存储过程查询应返回如下层次结构:

我想要这种格式的最终输出:
Employee_Id ...Manager_Id
- ....
请注意,Manager_Id是管理器的EmployeeId。
我尝试使用CTE with union all查询,但无法正确获取。
发布于 2013-06-05 03:20:16
实际上,你需要计算出递归性,因为在管理器上可以有一个管理器…
看一下:
问题是你需要2个查询...一个往上走,一个往下走……然后合并结果..。
既然一个人不能有两个经理,你为什么不合并这两个表呢?特别是因为经理也是雇员。这将简化所有的事情。
发布于 2013-06-05 03:14:52
您可以使用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发布于 2013-06-05 18:27:46
为了得到完整的层次结构,你需要在这里实现一些递归。
这里有一个快速而粗糙的示例,说明如何实现这一点以获得管理器层次结构。对于较低级别的层次结构,您也需要类似的内容
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
endhttps://stackoverflow.com/questions/16925370
复制相似问题