Измените функцию FindAll на функцию DoesExist в SQL Server - PullRequest
1 голос
/ 01 августа 2010

У меня есть следующая рекурсивная функция:

ALTER FUNCTION [dbo].[ListAncestors] 
(   
    @Id int
)   
RETURNS TABLE  
As  
RETURN  
(   
    WITH cte As  
    (   
        SELECT
            UserId,
            ManagerId,  
            Forename,
            Surname  
        FROM  
            dbo.Users   
        WHERE  
            UserId = @Id   

        UNION ALL  

        SELECT  
            T.UserID,
            T.ManagerID,  
            T.Forename,   
            T.Surname  
        FROM  
            cte As C INNER JOIN dbo.Users As T   
            ON C.UserID = T.ManagerID   
    )   
    SELECT
        Forename,
   Surname 
    FROM  
        cte
);

По сути, она возвращает имена всех пользователей ниже указанного пользователя (на основе их идентификатора).Я хотел бы изменить эту функцию и создать другую функцию, которая проверяет, является ли определенный идентификатор пользователя предком другого.

Я думаю, подпись будет выглядеть примерно так:

Ответы [ 2 ]

1 голос
/ 01 августа 2010

Если мы примем, что начальный CTE берет идентификатор и перечисляет всех «предков» этого идентификатора, я думаю, что следующий запрос проверяет это отношение.

WITH cte As  
(   
    SELECT
        UserId,
        Forename,
        Surname  
    FROM  
        dbo.Users   
    WHERE  
        UserId = @Id   

    UNION ALL  

    SELECT  
        T.UserID,  
        T.Forename,   
        T.Surname  
    FROM  
        cte As C INNER JOIN dbo.Users As T   
        ON C.UserID = T.ManagerID and C.UserID <> @ancestorID
)   
SELECT CAST (COUNT(*) as BIT) FROM cte WHERE UserID = @ancestorID

Это немного странно, поскольку, учитывая начальную функцию, человек находится в «предковом» отношении к себе.

Кстати, я удалил ManagerID из операторов выбора вCTE, поскольку это не нужно

1 голос
/ 01 августа 2010

Как насчет:

WHILE @Id IS NOT NULL AND @Id <> @AncestorId
BEGIN
 SET @Id = (
  SELECT ManagerId FROM dbo.Users WHERE UserId = @Id
 )
END

RETURN CASE WHEN @Id IS NOT NULL THEN 1 ELSE 0 END
...