提问人:David Lee 提问时间:3/8/2022 更新时间:3/8/2022 访问量:117
根据修订 ID 获取历史记录值
Get the history values based on Revision Id
问:
我有一个双表表,第一个表存储所有最新数据,第二个表用于捕获更改的数据。例如,如果用户更改值,则 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
答:
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 |
评论