I\'ve got a standard boss/subordinate employee table. I need to select a boss (specified by ID) and all his subordinates (and their subrodinates, etc). Unfortunately the rea
This is the code I used on a project to chase up and down hierarchical relationship trees.
User defined function to capture subordinates:
CREATE FUNCTION fn_UserSubordinates(@User_ID INT)
RETURNS @SubordinateUsers TABLE (User_ID INT, Distance INT) AS BEGIN
IF @User_ID IS NULL
RETURN
INSERT INTO @SubordinateUsers (User_ID, Distance) VALUES ( @User_ID, 0)
DECLARE @Distance INT, @Finished BIT
SELECT @Distance = 1, @Finished = 0
WHILE @Finished = 0
BEGIN
INSERT INTO @SubordinateUsers
SELECT S.User_ID, @Distance
FROM Users AS S
JOIN @SubordinateUsers AS C
ON C.User_ID = S.Manager_ID
LEFT JOIN @SubordinateUsers AS C2
ON C2.User_ID = S.User_ID
WHERE C2.User_ID IS NULL
IF @@RowCount = 0
SET @Finished = 1
SET @Distance = @Distance + 1
END
RETURN
END
User defined function to capture managers:
CREATE FUNCTION fn_UserManagers(@User_ID INT)
RETURNS @User TABLE (User_ID INT, Distance INT) AS BEGIN
IF @User_ID IS NULL
RETURN
DECLARE @Manager_ID INT
SELECT @Manager_ID = Manager_ID
FROM UserClasses WITH (NOLOCK)
WHERE User_ID = @User_ID
INSERT INTO @UserClasses (User_ID, Distance)
SELECT User_ID, Distance + 1
FROM dbo.fn_UserManagers(@Manager_ID)
INSERT INTO @User (User_ID, Distance) VALUES (@User_ID, 0)
RETURN
END