我有一個兩張表,第一張表存盤所有最新資料,第二張表用于捕獲更改的資料。例如,如果用戶更改值,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
uj5u.com熱心網友回復:
一種方法是使用外部應用
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 | 新測驗 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/439779.html
標籤:sql sql服务器 sql-server-2008 sql-server-2005 sql-server-2012
