【问题标题】:Max Recursion Exhausted before Statement Completion语句完成前用尽最大递归
【发布时间】:2022-11-30 04:40:05
【问题描述】:

我知道这里已经被问过并回答过几次,但我似乎找不到我的具体问题的答案。这是递归查询:

    CTE as (

    SELECT 
    ZipCode
    ,Age
    ,[Population]
    ,Deaths
    ,DeathRate
    ,Death_Proportion
    ,DeathProbablity
    ,SurvivalProbablity
    ,PersonsAlive

    FROM ProbabilityTable
    WHERE Age = 0
    
    UNION ALL 

    SELECT 
     p.ZipCode
    ,p.Age
    ,p.[Population]
    ,p.Deaths
    ,p.DeathRate
    ,p.Death_Proportion
    ,p.DeathProbablity
    ,p.SurvivalProbablity
    ,LAG(c.PersonsAlive,1) OVER(PARTITION BY p.ZipCode ORDER BY p.Age) * p.SurvivalProbablity

    FROM ProbabilityTable p
    INNER JOIN CTE c
    ON p.ZipCode = c.ZipCode
     and p.Age = c.Age
    WHERE p.Age < 86
    )

在 ProbabilityTable 中,当 Age = 0 时,PersonsAlive 被设置为 100,000。我想用递归 CTE 做的是将 PersonsAlive 的先前值乘以当前 SurvivalProbability 来计算该年龄的 PersonsAlive。年龄上升到 85 岁,所以这就是为什么我将终止条款设置为 86 岁。

我已经尝试多次调整查询的递归部分(并且还在锚点部分将 PersonsAlive 设置为 100,000)但我无法弄清楚。这是我第一次尝试递归查询,即使完成了一些课程作业,它也不适合我。

【问题讨论】:

  • 错误告诉你查询是错误的。 JOIN 条件可以轻松地将行连接到自身,从而导致无限递归。您可能应该将 WHERE p.Age &lt; 86 替换为 WHERE p.Age !=0 AND p.Age &lt; 86,否则根行可以连接到自身

标签: sql-server common-table-expression recursive-query


【解决方案1】:

JOIN 条件可以轻松地将行连接到自身,从而导致无限递归。您可能应该将 WHERE p.Age < 86 替换为 WHERE p.Age !=0 AND p.Age < 86,否则根行可以连接到自身:

FROM ProbabilityTable p
INNER JOIN CTE c
ON p.ZipCode = c.ZipCode
 and p.Age = c.Age
WHERE p.Age!=0 AND p.Age < 86

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2012-03-27
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多