当前位置: 首页 > 面试题库 >

游标vs. While循环-SQLServer

韩景辉
2023-03-14
问题内容

假设我在数据库(本例中为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 
 -----------------------------------------------------

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

公式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都对它返回的号码执行以下操作。maxrecursion选项将一个方程式的操作数限制为1000。当然,您可以将其设置得更高。

这个答案有些不完整,因为最终的选择查询将返回中间结果。不过,这很容易过滤。



 类似资料:
  • 问题内容: 请解释一下如何在oracle中使用游标进行循环。 如果我使用下一个代码,一切都很好。 但是,如果我为此sql语句定义变量,它将无法正常工作。 错误:PLS-00103 问题答案: 要解决与第二种方法相关的问题,您需要使用 游标变量和打开游标并获取数据的显式方式。它不是 允许在循环中使用游标变量: 了解更多

  • 我想循环存储过程的结果。我的代码: 我不明白为什么这是抛出必须声明c_curs的错误: 从命令-开始中的第7行开始时出错 结束<错误报告- ORA-06550:第2行,第24列: PLS-00201:必须声明标识符C_CURS

  • 本食谱演示了使用组合流来创建游戏循环的一种方式。本食谱旨在突出如何用响应式的方式来重新思考现有问题。在这个示例中,我们将提供整体循环以及自上帧以来的增量时间。与此相结合的是用户输入流,以及当前的游戏状态,我们可以用它来更新我们的对象,并根据每帧的发出来将其渲染到屏幕上。 示例代码 ( StackBlitz ) import { BehaviorSubject, Observable, of, fr

  • 我使用的是mongoDB PHP,当我使用find查询或聚合框架时,结果是一个游标,我可以使用foreach循环或while循环对游标进行迭代。例如,我要执行以下查询 我可以使用以下两种方法迭代结果

  • 我试图写一个代码为每个股票价值是75美元或更多添加一个"*"在STK_FLAG列。 ORA-06550:第15行,第21列:PLS-00201:标识符“STK\U FLG”必须声明ORA-06550:第15行,第5列:PL/SQL:SQL语句忽略ORA-06550:第23行,第7列:PL/SQL:ORA-00904:“STK\U FLG”:无效标识符ORA-06550:第17行,第5列:PL/SQ

  • 我正在使用mysql存储过程,我花了两个小时试图弄清楚为什么这个游标只运行一次。(我假设它只运行了一次,因为我运行这个存储过程后只看到一条记录——最后有一个命令,我从前面创建的临时表中选择了所有内容) 注意,我已经尝试过在游标中单独运行查询,它运行正常(返回了多条记录,这是应该的)。 我认为这一定与我从循环中插入数据有关(我希望在每个循环过程中向临时表中插入一行数据)。