有没有办法在不使用循环的情况下获得价值?

Posted

技术标签:

【中文标题】有没有办法在不使用循环的情况下获得价值?【英文标题】:Is there any way to get the value without using the loop? 【发布时间】:2018-08-08 10:43:31 【问题描述】:
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

有没有什么方法可以在不使用循环的情况下获取值?

【问题讨论】:

mysql sql server,未涉及的产品请勿标注 另外,不要将图像用于数据/代码,使用格式化文本。我回滚了你的图像编辑(或者也许 Zohar 打败了我)。 对于 SQL Server,使用递归 CTE。对于MySql我不知道。 如果你需要一个查询,那你为什么不去写一个呢?我们不是来为你做你的工作的。但是,如果您有疑问,或者遇到困难并且可以展示您已经尝试过的方法,那么我们很乐意为您提供帮助。 如何 id=2 给你两个不同的结果?您的示例中的 7 和 15 都用于 id=2 【参考方案1】:

为了避免循环,您可以使用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

【讨论】:

以上是关于有没有办法在不使用循环的情况下获得价值?的主要内容,如果未能解决你的问题,请参考以下文章

背包复习

有没有办法在不使用pairs()的情况下循环遍历数组?

asp.net中,在不播放视频的情况下如何获得视频长度

有没有办法在不使用游标的情况下循环遍历 SQL 中的表变量?

在不使用while循环的情况下找到最里面的异常?

有没有办法在不抛出异常的情况下转储堆栈跟踪?