根据修订 ID 获取历史记录值

Get the history values based on Revision Id

提问人:David Lee 提问时间:3/8/2022 更新时间:3/8/2022 访问量:117

问:

我有一个双表表,第一个表存储所有最新数据,第二个表用于捕获更改的数据。例如,如果用户更改值,则 FIRST 表将更新数据,SECOND 表将存储以前的数据和具有唯一修订 ID 的新数据。

问题:如果我想查看修订版 4 的数据,我不确定在此期间如何回溯值并找到表 1 中的确切数据

DECLARE @Projects TABLE(
    ProjectId int,
    ProjectName VARCHAR(255),
    StartQuarter int,
    EndQuarter int,
    StartYear int,
    EndYear int,
    Description varchar(255)
);

DECLARE @History TABLE(
    ProjectId int,
    RevisionId int,
    Attribute varchar(255),
    Previous varchar(255),
    New varchar(255)
);

INSERT INTO @Projects (ProjectId,ProjectName,StartQuarter,EndQuarter,StartYear,EndYear,Description)
VALUES (1,'P1', 1,4,2022,2022,'Test')

INSERT INTO @History (ProjectId ,   RevisionId ,    Attribute , Previous ,New )
values (1,2,'ProjectName', 'Project 1', 'Projects')
,(1,3,'Description', 'new', 'newtest')
,(1,4,'ProjectName', 'Projects', 'Alpha')
,(1,5,'Description', 'newtest', 'Test')
,(1,6,'ProjectName', 'Alpha', 'P1')

目前,完成所有更改后,该表如下所示:

ProjectId   ProjectName StartQuarter    EndQuarter  StartYear   EndYear   Description
1           P1          1               4           2022        2022      Test

现在我想在 RevisionId = 4 期间查看数据,输出应显示如下内容:

ProjectId   ProjectName StartQuarter    EndQuarter  StartYear   EndYear   Description
1           Alpha       1               4           2022        2022      newtest
sql sql-server sql-server-2012

评论

0赞 GuidoG 3/8/2022
为什么 revisionID 4 的预期结果描述中有“newtest”?
0赞 David Lee 3/8/2022
因为在修订版 3 中,我们已经将描述从“new”更改为“newtest”,所以在修订版 4 中,它应该会看到更改的值。因为这里的主要目标是显示数据在修订版 4 中的外观
2赞 Dale K 3/8/2022
请仅标记您正在使用的 SQL Server 版本!

答:

2赞 GuidoG 3/8/2022 #1

一种方法是使用 outer apply 的

select p.ProjectID,
       isnull(n.New, p.ProjectName) as ProjectName,
       p.StartQuarter,
       p.EndQuarter,
       p.StartYear,
       p.EndYear,
       isnull(d.New, p.Description) as Description
from   @Projects p

  outer apply ( select top 1
                       h.New
                from   @History h 
                where  h.ProjectId = p.ProjectId
                and    h.Attribute = 'ProjectName'
                and    h.RevisionId <= 4
                order by h.RevisionId desc
              ) n

  outer apply ( select top 1
                       h.New
                from   @History h 
                where  h.ProjectId = p.ProjectId
                and    h.Attribute = 'Description'
                and    h.RevisionId <= 4
                order by h.RevisionId desc
              ) d

结果是

项目 ID 项目名称 开始季度 季度末 开始年份 结束年份 描述
1 阿尔法 1 4 2022 2022 newtest