我在SQL Server中有一个用这个fiels的表:
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
可以预先计算(金额/税金*额外)并在所有列中使用预先计算值 像这样:
Select
@pre_calculated_value+Option1 as Value1,
@pre_calculated_value+Option2 as Value2,
@pre_calculated_value+Option3 as Value3
像每个列的变量一样?
感谢您的帮助!
答案 0 :(得分:0)
我找到了解决方案,"执行"创建期间的命令是解决方案。
参考。 http://blog.sqlauthority.com/2010/08/03/sql-server-computed-column-persisted-and%C2%A0performance/
答案 1 :(得分:0)
我通常按如下方式使用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和非PERSISTED之间的差异是性能和磁盘空间之间的权衡:PERSISTED占用实际磁盘空间但仅在INSERT时计算,如果任何引用的列更改值,而非PERSISTED是虚拟的仅在查询时计算的列,但是对于每个查询的每次运行都会计算它们。
答案 2 :(得分:0)
如果无法使用计算列存储该值,则另一个选项是使用交叉应用,IMO比CTE版本更具可读性。 e.g。
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