有没有不用循环就可以获取值的方法?

时间:2018-08-08 10:43:31

标签: sql sql-server sql-server-2008

Id       DependentId
-----    ------------
2        5
5        8
8        6
6        7
7        NULL
3        10
10       15
17       NULL
15       NULL

我编写了一个函数,如果我们传递参数2,该函数将从上表返回7。

其他示例:如果参数值为3,则返回值为15。

如果输入参数为17,则返回值为17

功能:

ALTER FUNCTION dbo.getValue
(
 @Id INT
)
RETURNS INT
AS
BEGIN
    DECLARE @DependentId AS INT
    WHILE (1 = 1)
        BEGIN
            SELECT @DependentId = DependentId FROM dbo.givenTable WHERE  Id = @Id;
            IF (@DependentId IS NOT NULL)
                    SET @Id = @DependentId
            ELSE
                BREAK;
        END 
        RETURN @Id
END
GO

有没有不用循环就可以得到值的方法?

1 个答案:

答案 0 :(得分:0)

为避免循环,可以使用Recursive CTE。 CTE的终止逻辑为WHERE DependentID is NULL

ALTER FUNCTION dbo.getValue
    (
        @Id INT
    )
RETURNS INT
AS
    BEGIN

        DECLARE @result INT;
        WITH RecursiveCTE
        AS ( SELECT ID ,
                    dependentID ,
                    Id AS BaseDependentId
             FROM   givenTable 
             WHERE  dependentID IS NULL

             UNION ALL

             SELECT T.id ,
                    T.DependentId ,
                    cte.BaseDependentId
             FROM   givenTable  AS T
                    INNER JOIN RecursiveCTE cte ON T.DependentId = cte.id
             )
        SELECT @result = BaseDependentId
        FROM   RecursiveCTE
        WHERE  Id = @Id

        RETURN @result

    END
GO