gpt4 book ai didi

sql - 游标与 While 循环 - SQL Server

转载 作者:行者123 更新时间:2023-12-02 19:30:28 25 4
gpt4 key购买 nike

假设我在数据库(本例中为 SQLServer 2008)中有一堆可用于创建方程的行。

 -----------------------------------------------------
OperationID | EquationID | Operation | Amount | Order
-----------------------------------------------------
1 | 1 | + | 12 | 1
2 | 1 | + | 12 | 2
3 | 2 | / | 2 | 3
4 | 2 | + | 12 | 1
5 | 2 | - | 2 | 2
-----------------------------------------------------

我需要想出一种方法来评估此表中的方程。

Equation 1: 12 + 12 = 24
Equation 2: (12 - 2)/2 = 5

我想不出一种无需迭代行即可获得这些结果的方法。我知道如何做到这一点的唯一方法是使用游标或通过使用临时表和 while 循环。有没有更好的方法来做到这一点?如果不是,通常什么会执行更好的游标或 while 循环?

注意:这有些简化,在项目的现阶段我们只能猜测数据会是什么样子。假设每个“方程”大约有 100 到 1000 次运算,并且每天有几千个“方程”需要处理。

最佳答案

事实证明,在得出运行总计方面,递归 CTE 的性能优于循环。这实际上只是一个带有变量运算符的运行总计,因此性能优势应该适用于此。

创建行为类似于循环的递归 CTE 的方法如下:

        ;WITH cte AS (
SELECT equation, number, order FROM table WHERE order = 1
UNION ALL
SELECT table.equation,
CASE WHEN table.operation = '+' THEN cte.number + table.number
WHEN table.operation = '-' THEN cte.number - table.number END AS number, --etc.
table.order FROM table INNER JOIN cte ON table.order = cte.order + 1 AND table.equation = cte.equation
)
SELECT equation, number, order
FROM cte
OPTION (MAXRECURSION 1000);

第一个 SELECT 获取最左边的数字,UNION all 对它返回的数字执行以下操作。 maxrecursion 选项将一个方程中的运算次数限制为 1000。当然,您可以将其设置得更高。

这个答案有些不完整,因为最终的选择查询将返回中间结果。不过,过滤起来相当简单。

关于sql - 游标与 While 循环 - SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4027477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com