【问题标题】:sql question regarding fine tuning a query关于微调查询的 sql 问题
【发布时间】:2011-07-27 16:47:11
【问题描述】:

我有一个返回多列的存储过程。像 colA colB colC .... colL 我可以编写另一个查询来获取相同的列,但如果 colC/colB

【问题讨论】:

    标签: sql


    【解决方案1】:

    您需要使用表变量(@)或临时表(#),因为您不能直接从存储过程的结果集中选择:

    DECLARE @table TABLE (colA int, colB int, colC int, ...)
    
    INSERT INTO @table
    EXEC StoreProcedureName
    
    SELECT * FROM @table WHERE colC * 10 < colB
    

    【讨论】:

      【解决方案2】:

      我假设这里的问题是您无法使用内联 SELECT 语句获取存储过程的结果;正确的?换句话说,你希望能够说,

      SELECT * FROM myProc WHERE (colcC / colB) < .1
      

      但是那行不通,因为在这种情况下你不能把存储过程当作表来对待。

      这个问题的最佳解决方案是创建一个新的存储过程,它做两件事:

      1) 将过程的结果复制到临时表中,如下所示:

      INSERT INTO #myTempTable EXEC myProcedure
      

      2) 选择您感兴趣的行,如下所示:

      SELECT * FROM #myTempTable WHERE (colC * 10) < colB
      

      (借用了纳尼亚的 colC * 10 技巧。)

      祝你好运!

      【讨论】:

      • 谢谢大家。我会用这个检查一下。
      【解决方案3】:

      应该可以。我可能会建议添加这样的 WHERE 子句:

      WHERE (colC * 10) < ColB
      

      这会让你不必做百分比和其他事情。

      您也可以只过滤代码中的结果。

      顺便说一句...这就是我转换 colC/ColB

      C/B < 10%
      C/B < .1     (convert percentage to decimal)
      C   < .1B    (multiply both sides by B)
      10C < B      (multiply both sides by 10)
      

      您甚至可以编写新的存储过程来获取您想要返回的百分比金额的变量。然后 where 子句将是 WHERE (colC * @percentage)

      【讨论】:

      • 我认为问题是存储过程不能被修改,所以你不能将 WHERE 子句直接应用于结果。
      • 好的。好点子。如果是这样,您的解决方案有效。如果他可以写一个新的存储过程,那么他可以使用这个解决方案。
      • 我喜欢 colC * 10 的把戏。很好地规避了不同数据类型的问题。
      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多