代码之家  ›  专栏  ›  技术社区  ›  James

在SQL Server中将FindAll函数修改为DoesExist函数

  •  1
  • James  · 技术社区  · 14 年前

    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
    );
    

    它基本上是返回指定用户下面的所有用户的名称(基于他们的ID)。我想做的是修改这个函数并创建另一个函数来检查一个特定的userID是否是另一个的祖先。

    我想签名应该是这样的:

    CREATE FUNCTION IsAncestor(@Id int, @AncestorId int) RETURNS BIT
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Will A    14 年前

    怎么样:

    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
    
        2
  •  1
  •   Yellowfog    14 年前

    如果我们接受初始CTE接受一个ID并列出该ID的所有“祖先”,我认为下面的查询将测试这个关系。

    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
    

    不过,这有点奇怪,因为给定最初的功能,一个人与自己处于“祖先”关系中。

    顺便说一句,我从CTE中的select语句中删除了ManagerID,因为它不是必需的