使用最新修订标记的记录的高效视图

时间:2013-10-16 19:15:35

标签: sql sql-server

我有一个表,称之为P,目前有一系列记录,每个记录都有一个唯一的密钥:

Key1 value1
Key2 value2
Key3 value3

等等,其中每个值实际上是一组列。

我现在要求使这些记录可变,并将更改历史记录为审计日志。

我认为最好的方法是修改P,使其成为

Key1 Rev1 value1
Key1 Rev2 value1a
Key2 Rev1 value2
Key2 Rev2 value2a

等等。任何给定密钥的最新记录始终具有最高版本标记。

问题是,这会破坏只能获得当前记录的查询的可比性。我正在考虑将P重命名为PComplete并创建一个只为每个键选择最高修订标记的视图P,并省略修订标记,从而模拟原始表格P

因为我不是主要的SQL专家:

这是一种可靠的技术吗? 设计新视图P的最佳方法是什么,以便为基本视图PBase中的每个当前键选择最新(最大的调用)行?

网站指针是最受欢迎的;我不知道谷歌有哪些条款可以找到此类解决方案的最佳实践方法。

注意:这是Microsoft SQL Server 2008 R2。

2 个答案:

答案 0 :(得分:1)

您的问题的第一部分很简单:使用像这样的修订列几乎是行业标准,至少在我工作的地方。

至于查看最新的记录,不幸的是没有语法上很漂亮的方法(这很奇怪,因为这一直出现,请参阅!)。但是如果你有一个基础记录表:

CREATE TABLE Records (
RecordID int,
RevisionID int,
ValueA varchar(50),
...
)

只显示最新版本(以及我亲自做的方式)的一种方式,就像你说的那样,通过一个观点:

CREATE VIEW CurrentRecords AS
SELECT r.RecordID,
   r.ValueA
   ...
FROM Records AS r
INNER JOIN (
    SELECT RecordID, MAX(RevisionID) AS RevisionID
    FROM Records
    GROUP BY RecordID
) AS maxRev on maxRev.RecordID = r.RecordID AND maxRev.RevisionID = r.RevisionID

首先按记录ID对最新修订的修订ID进行查找,然后使用该链接实际获取记录。只要在RevisionID列上有索引,就不会出现性能问题(与表扫描相反,它将是快速索引查找,以确定最大修订ID)。

谷歌搜索“带有最大值的SQL选择行”会显示一堆S-O链接,这个通常与我在这里写的内容一致:SQL Select only rows with Max Value on a Column。如果您想了解更多信息,请随意浏览我提供的标记部分,S-O帖子和Google查询!

答案 1 :(得分:0)

您可以尝试这样的方法:

  • 创建另一个名为PHistory的表,该列与原始列完全相同,另外一列用于修订号(int)或更新日期(datetime),您还可以将ID列添加为主列键

  • 每次主表中有更新时,在主表上使用update触发器将P表中的所有值复制到PHistorty表中

创建查询时,这将使事情变得清晰。当你想要最新的版本时,你总是从P表中选择,当你想看到一些修订时,你可以从PHistorty中选择。