我可以在同一视图中使用稍后在SQL Server视图中计算的列吗?

Lil*_*sey 2 t-sql sql-server sql-server-2005 view

我可以在同一视图中使用稍后在SQL Server视图中计算的列吗?

假设我有以下观点:

Select 
    t1.StartMile, t2.EndMile,  t2.EndMile- t1.StartMile as TotMile
from 
   TableStarts as t1 
inner join 
   TableEnds as t2 on t1.Id = t2.Id  
Run Code Online (Sandbox Code Playgroud)

有没有办法编辑视图来执行以下操作

Select  
    t1.StartMile, t2.EndMile, t2.EndMile - t1.StartMile as TotMile, 
    TotMile + 30  as EvenMoreMiles
Run Code Online (Sandbox Code Playgroud)

我试过这个并得到错误:

列名称"TotMile"无效

请不要告诉我使用t2.EndMile - t1.StartMile + 30 as EvenMoreMiles.TotMiles在我的实际代码中是一个长例句.

我宁愿不必创建一个中间视图.

我正在使用SQL Server 2005.

加上以后

感谢所有的答案.我会全力以赴.

答案提出了以下新问题:

鉴于有数千行,TotMiles如下所示,给出的答案中哪一个最有效?或者创建中间视图效率最高?

CASE WHEN t .TaskType = 1  and  t .StartTime < '1/1/2012'  
               THEN (tv.EndMile - tv.StartMile )  
     WHEN NOT (t .Location1_PKey = c.pkey OR t .Location2_PKey = c.pkey)
              then (tv.EndMile - tv.StartMile )
     WHEN (tv.EndMile - tv.StartMile ) < 31  Then 0 
     ELSE  (tv.EndMile - tv.StartMile - 30 )
END AS MilesAdjusted2012,
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 9

您也可以使用CROSS APPLY哪些更简洁,特别是如果您正在构建引用前面的别名链.

SELECT t1.StartMile,
       t2.EndMile,
       TotMile,
       EvenMoreMiles,
       AndYetMoreMiles
FROM   TableStarts AS t1
       INNER JOIN TableEnds AS t2
         ON t1.Id = t2.Id
       CROSS APPLY (SELECT t2.EndMile - t1.StartMile) A(TotMile)
       CROSS APPLY (SELECT TotMile + 30) A2(EvenMoreMiles)
       CROSS APPLY (SELECT EvenMoreMiles + 100) A3(AndYetMoreMiles)  
Run Code Online (Sandbox Code Playgroud)

  • @LillLansey - 嵌套的CTE或嵌套的Cross Apply都可能会对表达式进行一次评估,如果这就是你要问的那个?尽管您需要检查执行计划以查看,但在此区域并不能保证. (2认同)