Рекурсивный CTE-Найти всех сотрудников ниже менеджера

Я создал образец скрипки для этого 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 ответ

Решение

Попробуй это. Фильтр должен применяться в Anchor query CTE

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

Попробуйте это пожалуйста

declare @managerId int
SET @managerId = 3

select userId
  from Users as t1
 where managerId = @managerId
    or exists 
       ( select * 
           from Users as t2
          where userId = t1.managerId
            and (
                managerId = @managerId
             or exists 
                ( select * 
                    from Users as t3
                   where userId = t2.managerId 
                     and managerId = @managerId 
                )                 
                ) 
       ) 
Другие вопросы по тегам