SQL Server 2005 recursive query with loops in data - is it possible?

前端 未结 10 1846
野趣味
野趣味 2020-12-06 03:29

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

10条回答
  •  生来不讨喜
    2020-12-06 04:29

    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
    

提交回复
热议问题