有没有办法在不使用循环的情况下获得价值?
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
【讨论】:
以上是关于有没有办法在不使用循环的情况下获得价值?的主要内容,如果未能解决你的问题,请参考以下文章