2011-07-28 69 views
21

我有很多計算列,他們不斷重複自己,其中一個內部的其他人,包括嵌套案例陳述。如何重用計算列避免重複sql語句?

有一個真正簡化的版本,我正在尋找一種方法。

SELECT 
    (1+2) AS A, 
    A + 3 AS B, 
    B * 7 AS C 
FROM MYTABLE 

在此先感謝。

回答

16

你可以嘗試這樣的事情。

SELECT 
    A.Val AS A, 
    B.Val AS B, 
    C.Val AS C 
FROM MYTABLE 
    cross apply(select 1 + 2) as A(Val) 
    cross apply(select A.Val + 3) as B(Val) 
    cross apply(select B.Val * 7) as C(Val) 
+0

這可以通過使用嵌套的情況下,和/或連接來完成? –

+0

@Eduardo不確定你的意思。請使用一些示例查詢更新問題,使用您想要刪除的重複部分,我或其他人可以查看它。 –

1

「保存」您的計算結果的唯一方法是在子查詢中使用它們,這樣您就可以使用A, B and C。不幸的是,它不能以其他方式完成。

1

您可以創建computed columns來表示所需的值。另外,如果您的計算依賴於單獨的表中的數據,則可以使用view

0

你想計算結果嗎?在這種情況下,您可以將相關計算放在標量用戶定義的函數中,並在您的select聲明中使用。

還是你想的計算結果顯示爲表中的列,然後使用一個計算列:

CREATE TABLE Test(
    ID INT NOT NULL IDENTITY(1,1), 
    TimesTen AS ID * 10 
) 
6

您不能通過稍後引用其列別名來引用剛剛創建的表達式。將整個選擇列表視爲同時或以隨機順序實現 - 當您嘗試創建表達式以創建B時,A還不存在。您需要重複表達式 - 我不認爲您馬上就能作出‘簡單’計算列,而不必重複它們,並查看相同的 - 你必須巢的事情,比如:

SELECT A, B, C = B * 7 
FROM 
(
    SELECT A, B = A + 3 
    FROM 
    (
    SELECT A = (1 + 2) 
) AS x 
) AS y; 

或重複的表達(但我想那是你'重新嘗試避免)。

4

如果有人仍有意另一種選擇:

with aa(a) as (select 1+2) 
, bb(b) as (select a+3 from aa) 
,cc(c) as (select b*7 from bb) 
SELECT aa.a, bb.b, cc.c 
from aa,bb,cc