假设我在数据库(本例中为 SQL Server 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
-----------------------------------------------------
我需要想出一种方法来评估该表中的方程。
公式 1:12 + 12 = 24
公式 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。当然,您可以将其设置得更高。
这个答案有些不完整,因为最终的选择查询将返回中间结果。不过,过滤起来相当简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)