2011-11-18 71 views
3

如何在同一选择中多次使用计算列而不重复表达式并且不使用公用表表达式或复杂子查询?如何避免在同一选择中多次重复计算的表达式?

DECLARE @T TABLE (NUM1 INT,NUM2 INT) 
INSERT INTO @T VALUES (2,3); 
INSERT INTO @T VALUES (5,7); 
INSERT INTO @T VALUES(32,3); 
INSERT INTO @T VALUES(6,8); 

SELECT (NUM1+NUM2) [ADD], [ADD]*2, [ADD]/2,* FROM @T 

有没有什么办法可以在SQL Server 2005中解决这个问题?

+0

是添加计算列的表,或表的视图,一个选择吗? – HABO

回答

8

可以使用横aplly

SELECT T2.[ADD], 
     T2.[ADD]*2, 
     T2.[ADD]/2 
FROM @T AS T1 
    CROSS APPLY (SELECT T1.NUM1+T1.NUM2) AS T2([ADD]) 

或CTE

;WITH C AS 
(
    SELECT NUM1+NUM2 AS [ADD] 
    FROM @T 
) 
SELECT [ADD], 
     [ADD]*2, 
     [ADD]/2 
FROM C 

或子查询(也称为派生表)

SELECT T.[ADD], 
     T.[ADD]*2, 
     T.[ADD]/2 
FROM (
     SELECT NUM1+NUM2 AS [ADD] 
     FROM @T 
    ) AS T 

这是不可能使用在声明的同一个字段列表中的列别名。

1

你可以使用派生表来实现:

SELECT 
    *, 
    [ADD]*2, 
    [ADD]/2 
FROM 
(
    SELECT (NUM1+NUM2) AS [ADD], NUM1, NUM2 FROM @T 
) AS A