2011-03-03 39 views
14

可以說我在某個表上有一個巨大的選擇。列的一個值是使用複雜的logc計算的,其值爲列A。現在,對於另一列,我需要ColumnA的值,併爲其添加一些其他靜態值。將列的值用於另一列(SQL Server)?

樣品SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ... 

[ColumnA] + 10是什麼即時尋找。複雜的東西是一個巨大的情況/時塊。

想法?

回答

16

如果要引用這就是SELECT子句中計算的值,則需要將現有的查詢移動到子SELECT:

SELECT 
    /* Other columns */, 
    ColumnA, 
    ColumnA + 10 as ColumnB 
FROM 
(select table.id, table.number, complex stuff [ColumnA].. from table ... 
) t 

你必須爲該表引入別名(在上面的t中,在括號後面),即使您不打算使用它。

(等效 - 假設你使用SQL Server 2005或更高版本 - 您可以將現有的查詢移動到CTE):

;WITH PartialResults as (
    select table.id, table.number, complex stuff [ColumnA].. from table ... 
) 
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults 

熱膨脹係數傾向於尋找更清潔,如果你已經有了一個局部多層次計算正在完成,也就是說如果你現在有一個依賴於ColumnB的計算來包含在你的查詢中。

1

您可以通過子查詢和列別名解決此問題。

下面是一個例子:

SELECT MaxId + 10 
FROM (SELECT Max(t.Id) As MaxId 
     FROM SomeTable t) As SomeTableMaxId 
1

,你可以:

  1. 執行+ 10在客戶端代碼
  2. 寫標量值函數來封裝邏輯complex stuff。它將被優化爲一次通話。
  3. 複製complex stuff其他列的邏輯。它應該被優化成1個呼叫。
  4. 使用子選擇應用附加計算
+0

+1我喜歡那第二個想法 – 2011-03-03 13:14:32

相關問題