对于这种情况,临时表的SQL必要性

时间:2017-03-03 14:55:42

标签: sql-server

我正在使用Microsoft SQL服务器。

我经常遇到这种代码:

select (a*5 + a*4 + a*3) as a1 --some complicated and very long manipulation of column 'a'
into #Temp1
from Table1

select a1, case when a1 > 5 then 1 else 0 end as myResult
from #Temp1

我尝试过使用:

select (a*5 + a*4 + a*3) as a1, case when a1 > 5 then 1 else 0 end as myResult
from Table1

它会将错误视为' a1'的无效列名。我理解这一点,但对于像我这样的情况,有没有办法避免创建#Temp1步骤?

编辑: 我知道这样的编码结构:

select (a*5 + a*4 + a*3) as a1, case when (a*5 + a*4 + a*3) > 5 then 1 else 0 end as myResult
from Table1

对于一个非常错综复杂的操纵柱子' a'代码变得不可读。

2 个答案:

答案 0 :(得分:4)

您不能引用在同一个select语句中创建的列,但您可以这样做:

select a1, case when a1 > 5 then 1 else 0 end as myResult
from (
  select (a*5 + a*4 + a*3) as a1 --some complicated and very long manipulation
  from Table1
) X

你也可以用CTE做类似的事情,或者使用外部应用来创建带有select的新列。

答案 1 :(得分:0)

您可以轻松地将计算放入您的选择中两次,但我重读了您的问题,并意识到您说计算稍微高一点,所以我会选择James Z的答案。

select (a*5 + a*4 + a*3) as a1, case when (a*5 + a*4 + a*3) > 5 then 1 else 0 end as myResult
from Table1