如何避免此子查询并创建索引视图?

时间:2014-07-23 09:29:19

标签: sql sql-server subquery indexed-view

我使用SQL Server 2008.我有以下表格" Forecast"。

Forecast_ID | Budget_Code | IAM_ID | Forecast | Timestamp
1           | 00-0001     | 24     | 123.41   | '01-01'2010'  
2           | 00-0001     | 10     | 111.41   | '02-02'2010' //Is Last
3           | 00-0001     | 44     | 457.10   | '02-02'2010' //Is Last
4           | 00-0002     | 258    | 20       | '01-05'2011' //Is Last
5           | 00-0003     | 3      | 215      | '11-12'2013' //Is Last
6           | 00-0003     | 31     | 85.2     | '10-01'2010' 
7           | 00-0003     | 2      | 15       | '10-01'2010' 

我尝试创建一个带有持续时间的索引视图" Forecasts"根据Budget_Code,i。即具有最高时间戳的预测(每个Budget_Code一行或多行)。

所以我做了以下查询:

CREATE VIEW LastForecasts
WITH SCHEMABINDING
AS
    SELECT Forecast_ID, Budget_Code, IAM_ID, Forecast
    FROM dbo.[Plan] p1
    WHERE Timestamp = (
           SELECT MAX(Timestamp) 
           FROM dbo.[Plan] p2 
           WHERE p1.Budget_Code = p2.Budget_Code)
GO
CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON LastForecasts (Forecast_ID);
GO

但我有以下错误:

无法在视图上创建索引" OperationPlanDB.dbo.LastForecasts"因为它包含一个或多个子查询。考虑更改视图以仅使用联接而不是子查询。或者,请考虑不为此视图编制索引。

如何避免使用此子查询并使用持续时间预测索引我的视图?

1 个答案:

答案 0 :(得分:0)

您无法在索引视图中使用子查询。我建议使用以下查询以提高性能而不是查询:

SELECT *
FROM (
    SELECT Forecast_ID, 
            Budget_Code, 
            Forecast,
            ROW_NUMBER() OVER (PARTITION BY Budet_Code ORDER BY Timestamp DESC) row
    FROM dbo.[Plan] p1
    )z
WHERE Z.row=1