SQL GROUP BY: получение последней обновленной записи для индексированного представления - PullRequest
0 голосов
/ 17 июля 2009

Я пытаюсь сделать версионность строк, используя индексированное представление, группируя записи по их ключу и метке времени, и получая максимальную (метку времени) запись. Это нормально, но запрос, который я использовал (см. Представление ниже), выполняет самообъединение, что означает, что его нельзя использовать в индексированном представлении, что, я думаю, будет иметь важное значение для производительности. Есть ли способ переписать запрос, чтобы представление могло быть успешно создано с помощью SCHEMABINDING?

Я использую 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

1 Ответ

2 голосов
/ 17 июля 2009

Если вы замените ItemHistory на dbo.ItemHistory в определении Items, это должно сработать.

Также может оказаться, что следующий запрос работает лучше, поскольку он позволяет избежать использования функции 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 
...