首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >得到员工的上级。然后再得到员工的上级的上级。诸若此类

得到员工的上级。然后再得到员工的上级的上级。诸若此类
EN

Stack Overflow用户
提问于 2021-06-08 11:30:20
回答 3查看 46关注 0票数 0

我有一个employees表,其中有一个列Employee_ID和SuperiorID。我想要得到某个特定员工的所有上级。如Employee_ID-1000000的上级为1000001、1000002、1000003、1000004和1000005

代码语言:javascript
复制
+--------------------------+
| Employee_ID | SuperiorID |
+--------------------------+
|   1000000   |    1000001 |
|   1000001   |    1000002 |
|   1000002   |    1000003 |
|   1000003   |    1000004 |
|   1000004   |    1000005 |
+--------------------------+

Employee_ID - 1000005是该公司的总裁。

我现在有一个问题:

代码语言:javascript
复制
DECLARE @EmployeeNo AS INT = 1000000
SELECT Superior_ID from EmployeeTable WHERE Employee_ID  = @EmployeeNo
UNION
SELECT Superior_ID from EmployeeTable WHERE Employee_ID  = (select Superior_ID from EmployeeTable WHERE Employee_ID  = @EmployeeNo)
UNION
SELECT Superior_ID from EmpoyeeTable WHERE Employee_ID = ( SELECT Superior_ID from EmployeeTable WHERE Employee_ID  = (select Superior_ID from EmployeeTable WHERE Employee_ID  = @EmployeeNo))

有没有更好的方法来解决这个问题?

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2021-06-08 11:38:24

是的,您需要recursive cte

代码语言:javascript
复制
DECLARE @EmployeeNo AS INT = 1000000;
with cte as (
  select Employee_ID, SuperiorID
  from EmployeeTable where Employee_ID  = @EmployeeNo
  union all 
  select e.Employee_ID, e.SuperiorID
  from cte join EmployeeTable e on cte.SuperiorID = e.Employee_ID
  where e.Employee_ID <> '1000005' --president
)
select * from cte;
票数 0
EN

Stack Overflow用户

发布于 2021-06-08 11:39:04

我们可以在这里使用递归分层查询。下面的策略是从employee 1000000开始沿着命令链向上构建完整的层次结构。递归止于employee 1000004,其上级没有进一步的记录。在下面的递归CTE中,我跟踪了一个计数器,它随着每一步的递增而递增。然后,我们使用TOP技巧只选择排名最高的记录。

代码语言:javascript
复制
WITH cte (EmployeeID, SuperiorID, n) AS (
    SELECT Employee_ID, SuperiorID, 1
    FROM EmployeeTable
    WHERE Employee_ID = 1000000
    UNION ALL
    SELECT e.Employee_ID, e.SuperiorID, n+1
    FROM cte t
    INNER JOIN EmployeeTable e
        ON t.SuperiorID = e.Employee_ID
)

SELECT TOP 1 *
FROM cte
ORDER BY n DESC;

Demo

票数 0
EN

Stack Overflow用户

发布于 2021-06-09 02:41:12

试试这个:

代码语言:javascript
复制
DECLARE     @EmployeeTable  TABLE   (EmployeeID int, SuperiorID int);
INSERT INTO @EmployeeTable
    VALUES  
            (1000000, 1000001)
        ,   (1000001, 1000002)
        ,   (1000002, 1000003)
        ,   (1000003, 1000004)
        ,   (1000004, 1000005)
;

DECLARE @EmployeeNo int =   1000004
    ,   @President  int =   1000005
;

WITH    Employee    AS
    (
        SELECT 
                EmployeeID  =   @EmployeeNo
        UNION ALL
        SELECT  EmployeeID =  S.SuperiorID
        FROM    Employee        E
        JOIN    @EmployeeTable  S ON S.EmployeeID = E.EmployeeID
    )

SELECT * FROM Employee
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67881046

复制
相关文章

相似问题

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