2011-12-21 53 views
2

我可以在同一视图中使用稍后在SQL Server视图中计算的列吗?我可以在同一视图中使用稍后在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 

有编辑视图做以下

Select 
    t1.StartMile, t2.EndMile, t2.EndMile - t1.StartMile as TotMile, 
    TotMile + 30 as EvenMoreMiles 

我尝试这样的方式,得到了错误:

Invalid column name 'TotMile'

请不要告诉我使用t2.EndMile - t1.StartMile + 30 as EvenMoreMilesTotMiles在我的实际代码中是一个很长的案例陈述。

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

我使用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, 
+3

当谈到效率问题时,答案通常是“取决于” - 我们不知道你的数据是什么样的,你有什么指数等等。我们也不知道是否即使假设最差的解决方案已经足够有效达到您的目的,或者我们的表现最佳的答案仍然不足以满足您的情况/ – 2011-12-21 20:32:56

+0

感谢Damien。我很懒。 – 2011-12-21 20:45:35

回答

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) 
+0

请参阅第I节添加的效率问题 – 2011-12-21 20:30:01

+2

@LillLansey - 嵌套的CTE或嵌套交叉应用都可能会评估一次表达式,如果这是你所问的?虽然您需要检查执行计划才能看到,但在这方面没有太多保证。 – 2011-12-21 20:32:47

+0

谢谢。我在这里很懒惰。 – 2011-12-21 20:36:47

3

你不能直接,但你可以建立子选择:

select StartMile,EndMile,TotMile,TotMile+30 as EvenMoreMiles from (
    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 
) t 

或者使用公用表表达式:

;with FirstCalcs as (
    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 
) 
select StartMile,EndMile,TotMile,TotMile+30 as EvenMoreMiles from FirstCalcs 

我通常喜欢使用的CTE如果将会有多个层次来构建最终的计算结果,否则大多数格式化方案都难以进行选择,子选择,子子选择等等,这些都很容易阅读。 CTE可以包括对以前定义的CTE的引用:

;with CTE1 as (
    SELECT ... 
), CTE2 as (
    SELECT ... FROM CTE1 
), CTE3 as (
    SELECT ... FROM CTE2 
), CTE4 as (
    SELECT ... FROM CTE2 ... CTE3 
) 
SELECT ... FROM CTE4 ... CTE1 
+0

请参阅第I节添加的效率问题 – 2011-12-21 20:30:14

1

尝试使用派生表。

SELECT 
    DerivedTable.*, 
    TotMile + 30 as EvenMoreMiles 
From (Select 
     t1.StartMile, 
     t2.EndMile, 
     t2.EndMile- t1.StartMile as TotMile 
     FROM Table t1 
     Inner Join table2 t2 on t1.PK = t2.FK) DerivedTable 
+0

请参阅第I节添加的效率问题 – 2011-12-21 20:30:42

1

您可以使用公用表表达式(CTE)来执行此操作。在这里地段:http://www.4guysfromrolla.com/webtech/071906-1.shtml

基本上,

CREATE VIEW ... AS 

WITH Mileage (StartMile, EndMile, TotMile) AS (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) 

SELECT TotMile FROM Mileage 
+0

固定,谢谢Damien – 2011-12-21 20:25:27

+0

请参阅第I节添加的效率问题 – 2011-12-21 20:30:28

相关问题