2009-07-17 83 views
0

我試圖使用索引視圖進行行版本控制,按照其鍵和時間戳對記錄進行分組,並獲取最大(timestamp)記錄。這很好,但我使用過的查詢(請參見下面的視圖)進行了自連接,這意味着它不能用於索引視圖中,我認爲這對於性能至關重要。有沒有辦法重寫查詢,以便視圖可以成功創建WITH SCHEMABINDING?SQL GROUP BY:獲取索引視圖的最近更新記錄

我使用2005年,但2008年唯一的解決方案將罰款。

IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Items]')) 
    DROP VIEW [dbo].[Items] 
GO 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ItemHistory]') AND type in (N'U')) 
    DROP TABLE [dbo].[ItemHistory] 
GO 
CREATE TABLE [dbo].[ItemHistory](
    [Key] [nchar](10) NOT NULL, 
    [Value] [int] NOT NULL, 
    [TimeStamp] Timestamp NOT NULL, 
    [LastUpdateBy] [varchar](50) NOT NULL CONSTRAINT [DF_ItemHistory_LastUpdateBy] DEFAULT (SUSER_NAME()), 
    [Deleted] BIT NOT NULL DEFAULT (0) 
    CONSTRAINT [PK_ItemHistory] PRIMARY KEY CLUSTERED 
    (
     [Key] ASC, 
     [TimeStamp] ASC 
    ) ON [PRIMARY] 
) 
GO 
CREATE VIEW dbo.Items 
--WITH SCHEMABINDING --doesnt work with the query below :(
AS 
    SELECT ih.[key], ih.[Value] FROM ItemHistory ih 
    INNER JOIN (
     SELECT [Key], Max([TimeStamp]) [TimeStamp] 
     FROM ItemHistory 
     GROUP BY [Key] 
    ) ih2 ON ih.[key] = ih2.[key] AND ih.[TimeStamp] = ih2.[TimeStamp] AND Deleted = 0 
GO 
INSERT INTO Items ([Key], [Value]) VALUES ('ItemA', 1) 
INSERT INTO Items ([Key], [Value]) VALUES ('ItemA', 2) 
INSERT INTO Items ([Key], [Value]) VALUES ('ItemA', 3) 

GO 
SELECT * FROM ItemHistory 
SELECT * FROM Items 

回答

2

如果您在Items視圖定義替換ItemHistorydbo.ItemHistory它應該工作。

此外,您可能會發現以下查詢執行得更好,因爲它避免使用MAX函數。

CREATE VIEW dbo.Items 
WITH SCHEMABINDING 
AS 
    SELECT ih.[key], ih.[Value] FROM dbo.ItemHistory ih 
    WHERE NOT EXISTS (SELECT [Key] 
     FROM dbo.ItemHistory AS ih2 
     WHERE ih.[key] = ih2.[key] AND ih.[TimeStamp] < ih2.[TimeStamp]) AND Deleted = 0 
GO 
+0

你先生,是一個天才。我先生,是個白癡。沒有正確閱讀創建消息。 將 SELECT IH。[鍵],1H。[值] FROM dbo.ItemHistory IH WHERE NOT EXISTS(SELECT TOP 1 [關鍵] FROM dbo.ItemHistory AS IH2 WHERE IH。[鍵] = IH2。[ [TimeStamp] mcintyre321 2009-07-17 11:09:24