Sql server SQL分组依据:获取索引视图的最新更新记录
我尝试使用索引视图进行行版本控制,根据记录的键和时间戳对记录进行分组,并获取maxtimestamp记录。这很好,但我使用的查询(请参见下面的视图)执行自联接,这意味着它不能用于索引视图,我认为这对性能至关重要。是否有方法重写查询,以便通过SCHEMABINDING成功创建视图 我使用的是2005年,但只有2008年的解决方案也可以Sql server SQL分组依据:获取索引视图的最新更新记录,sql-server,tsql,group-by,indexed-view,Sql Server,Tsql,Group By,Indexed View,我尝试使用索引视图进行行版本控制,根据记录的键和时间戳对记录进行分组,并获取maxtimestamp记录。这很好,但我使用的查询(请参见下面的视图)执行自联接,这意味着它不能用于索引视图,我认为这对性能至关重要。是否有方法重写查询,以便通过SCHEMABINDING成功创建视图 我使用的是2005年,但只有2008年的解决方案也可以 IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Items]'))
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
如果在Items视图定义中将ItemHistory替换为dbo.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
先生,你是个天才。先生,我是个白痴。没有正确阅读创建邮件。将从dbo.ItemHistory ih中选择ih.[key],ih.[Value],如果不存在,则从dbo.ItemHistory中选择TOP 1[key]作为ih2,其中ih.[key]=ih2.[key]和ih.[TimeStamp]