首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成员工层次结构

生成员工层次结构
EN

Stack Overflow用户
提问于 2013-06-05 02:54:25
回答 3查看 6.6K关注 0票数 0

我有两个表:EmployeeMasterEmployeeDetails。两者的模式如下:

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

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

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

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

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

Employee_Id ...Manager_Id

- ....

请注意,Manager_Id是管理器的EmployeeId。

我尝试使用CTE with union all查询,但无法正确获取。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-05 03:20:16

实际上,你需要计算出递归性,因为在管理器上可以有一个管理器…

看一下:

  • http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx
  • http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

问题是你需要2个查询...一个往上走,一个往下走……然后合并结果..。

既然一个人不能有两个经理,你为什么不合并这两个表呢?特别是因为经理也是雇员。这将简化所有的事情。

票数 2
EN

Stack Overflow用户

发布于 2013-06-05 03:14:52

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

代码应该是这样的:

代码语言:javascript
复制
SELECT 
    ed.employeeid 'Employee ID',
    em.employeeid 'Manager ID', 
FROM EMPLOYEEMASTER em CROSS JOIN EMPLOYEEDETAILS ed
WHERE ed.manager = em.username
票数 1
EN

Stack Overflow用户

发布于 2013-06-05 18:27:46

为了得到完整的层次结构,你需要在这里实现一些递归。

这里有一个快速而粗糙的示例,说明如何实现这一点以获得管理器层次结构。对于较低级别的层次结构,您也需要类似的内容

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16925370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档