已经证明,递归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都对它返回的号码执行以下操作。maxrecursion选项将一个方程式的操作数限制为1000。当然,您可以将其设置得更高。
这个答案有些不完整,因为最终的选择查询将返回中间结果。不过,这很容易过滤。