【问题标题】:Avoid repetitive calculations in columns? SQL Server query避免列中的重复计算? SQL Server 查询
【发布时间】:2014-09-25 12:22:44
【问题描述】:

我在 SQL Server 中有一个包含以下字段的表:

t1(金额、税收、额外、选项1、选项2、选项3)

我有一个这样的查询:

Select 
(Amount/Tax*Extra)+Option1 as Value1,
(Amount/Tax*Extra)+Option2 as Value2,
(Amount/Tax*Extra)+Option3 as Value3
From t1

可以预先计算 (Amount/Tax*Extra) 并在所有列中使用预先计算的值 像这样:

Select
@pre_calculated_value+Option1 as Value1,
@pre_calculated_value+Option2 as Value2,
@pre_calculated_value+Option3 as Value3

就像一个变量,但对于每一列?

感谢您的帮助!

【问题讨论】:

  • 你知道什么是计算列吗?

标签: sql sql-server calculated-columns


【解决方案1】:

我通常如下使用 CTE:

;WITH cte AS
(
   SELECT (t1.Amount / t1.Tax * t1.Extra) AS [CalculatedValue],
          t1.Option1,
          t1.Option2,
          t1.Option3
   FROM t1
)
SELECT cte.[CalculatedValue] + Option1 AS [Value1],
       cte.[CalculatedValue] + Option2 AS [Value2],
       cte.[CalculatedValue] + Option3 AS [Value3],

这假设您只需要在可能只是这个或相对较少的查询中进行此计算。如果计算将在许多/大多数查询中使用,您可以使用计算列(持久或非持久)。在这一点上,PERSISTED 和 non-PERSISTED 之间的差异是性能和磁盘空间之间的权衡:PERSISTED 占用实际磁盘空间,但仅在 INSERT 和任何引用的列更改值时计算,而非 PERSISTED 是虚拟的仅在查询时计算的列,但对于引用它们的每个查询的每次运行。

【讨论】:

    【解决方案2】:

    我找到了解决方案,创建过程中的“持久”命令就是解决方案。

    参考。 http://blog.sqlauthority.com/2010/08/03/sql-server-computed-column-persisted-and%C2%A0performance/

    【讨论】:

      【解决方案3】:

      如果无法使用计算列存储该值,则另一种选择是使用交叉应用,IMO 比 CTE 版本更具可读性。例如

      Select 
          a.val+Option1 as Value1,
          a.val+Option2 as Value2,
          a.val+Option3 as Value3
      From t1 CROSS APPLY (SELECT Amount/Tax*Extra AS val) a
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多