2014-09-25 112 views
0

我在SQL Server中的表與此fiels:避免在列中進行重複計算? 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 

有可能預先計算(金額/稅* Extra)以及所有列 這樣使用預先計算值:

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

像一個可變的但每個列?

感謝您的幫助!

+0

你知道什麼計算列是什麼? – Horaciux 2014-09-25 14:03:53

回答

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], 

這是假設你只需要這個計算中,也許只是這樣,還是相對較少的,查詢。如果計算將用於許多/大多數查詢中,則可以使用計算列(持久或非持久)。在這一點上,堅持和非持續的區別是性能和磁盤空間之間的權衡:堅持佔用實際的磁盤空間,但插入時只計算,如果任何引用的列的變化值,非持久化的虛擬僅在查詢時才計算的列,但是對於每次查詢引用的每個查詢運行的列。

0

如果值不能使用計算列存儲,則另一個選項是使用交叉應用,即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