递归 CTE - 查找经理下的所有员工

Posted

技术标签:

【中文标题】递归 CTE - 查找经理下的所有员工【英文标题】:Recursive CTE-Find all Employees Below Manager 【发布时间】:2014-12-24 05:18:53 【问题描述】:

我为此 SQLFIDDLE 创建了一个示例小提琴

CREATE TABLE [dbo].[Users](
    [userId] [int] ,
    [userName] [varchar](50) ,
    [managerId] [int] ,
   )

INSERT INTO dbo.Users
    ([userId], [userName], [managerId])
VALUES
(1,'Darry',NULL),
(2,'Cono',1),
(3,'Abros',2),
(4,'Natesh',1),
(5,'Ani',3),
(6,'Raju',5),
(7,'Pinky',5),
(8,'Miya',4)

我的要求就像显示该特定经理下方的所有员工层次结构

这是我尝试过的

WITH UserCTE AS (
  SELECT userId, userName, managerId, 0 AS EmpLevel
  FROM Users where managerId IS NULL

  UNION ALL

  SELECT usr.userId, usr.userName, usr.managerId, mgr.[EmpLevel]+1
  FROM Users AS usr
    INNER JOIN UserCTE AS mgr
      ON usr.managerId = mgr.userId where usr.managerId IS NOT NULL
)
SELECT * 
  FROM UserCTE AS u where u.ManagerId=3
  ORDER BY EmpLevel;

输出:

userName
--------
    Ani

我期望的输出是,如果我给 ManagerId 3,那么应该显示以下员工

1.Abros
2.Ani
3.Raju
4.Pinky

谁能帮忙解决这个问题

【问题讨论】:

【参考方案1】:

试试这个。过滤器必须在 CTE 的Anchor query 中应用

WITH UserCTE
     AS (SELECT userId,
                userName,
                managerId,
                0 AS EmpLevel
         FROM   [Users]
         WHERE  managerId = 3
         UNION ALL
         SELECT usr.userId,
                usr.userName,
                usr.managerId,
                mgr.[EmpLevel] + 1
         FROM   [Users] AS usr
                INNER JOIN UserCTE AS mgr
                        ON usr.managerId = mgr.userId
         WHERE  usr.managerId IS NOT NULL)
SELECT *
FROM   UserCTE AS u
ORDER  BY EmpLevel; 

FIDDLE DEMO

【讨论】:

是否可以修改它,如果特定员工不是经理,则返回相同的员工本身。例如:如果我通过经理 id 8,那么它应该返回用户“Miya”本身的详细信息 @vmb - 您应该将其作为另一个问题提出或使用此请求更新您的问题。 @vmb 你得到答案只是因为最后一行SELECT userId, userName, managerId, 0 AS EmpLevel from Users where userId=8 CTE 没有在那个查询中使用 我会在多轮测试后将其标记为答案 @vmb - 慢慢来 :)

以上是关于递归 CTE - 查找经理下的所有员工的主要内容,如果未能解决你的问题,请参考以下文章

Presto SQL 是不是像 SQL Server 一样支持使用 CTE 进行递归查询?例如员工等级

SQL 查询以获取每个经理下的员工的递归计数

CTE 递归语句,带自连接,不带 id

递归 CTE 查找父记录

SQL查询以递归方式获取经理下所有员工的姓名

SQL 递归查询,意淫CTE递归的执行步骤