*对不起,我找不到更好的问题标题
我正在实施审核功能,目前正在使用EntityFramework-Plus提供的审核表, 有两个表,一个跟踪修改类型,另一个实体(每个记录代表用户的更新):
[AuditEntryID]
,[EntitySetName]
,[EntityTypeName]
,[State]
,[StateName]
,[CreatedBy]
,[CreatedDate]
,在另一个表中,每个修改都有相应的更改,最重要的列是特定OldValue
的{{1}}和NewValue
:
PropertyName
因此,要选择在特定表格和特定 [AuditEntryPropertyID]
,[AuditEntryID]
,[RelationName]
,[PropertyName]
,[OldValue]
,[NewValue]
上完成的所有修改,我会运行此查询:
Id
由于每次插入PK都是编辑还是删除,在上面的查询中我选择了给定 SELECT * FROM dbo.[AuditEntryProperties]
WHERE AuditEntryID IN (
SELECT AuditEntryID
FROM dbo.[AuditEntryProperties]
WHERE NewValue = '8b5f8272-8663-451d-8bf8-45d7d5db1529' AND PropertyName = 'CountryId')
AND AuditEntryID IN (
SELECT AuditEntryID
FROM dbo.[AuditEntries]
WHERE EntitySetName = 'TbCountries' )
的所有历史记录。
我需要的是我想要实现用户可以在特定时间返回特定记录的功能。 我用油漆画了它,它描绘了这个想法:
第一行是插入状态,第二行是Id
和col1
上的编辑,第三行是编辑col2
和col1
等等。
col3
是主键,因此每次都插入它(它的值不会改变!)
现在最近的记录是mod6,我需要回到mod3,所以我将从mod3获取col1
值,从mod2获取col1
值,{{1来自mod3,来自mod1的col2
。
我的问题是如何在特定col3
的表col4
中形成TbCountries
类型的完整记录?
答案 0 :(得分:1)
您可以使用row_number()
获取属性和值列表:
select aep.*
from (select ae.EntitySetName, aep.propertyname, aep.newvalue,
row_number() over (partition by ae.EntitySetName, aep.propertyname
order by ae.createddate desc
) as seqnum
from dbo.AuditEntries ae join
dbo.AuditEntryProperties aep
on ae.AuditEntryID = aep.AuditEntryID
where ae.createddate < @date and ae.EntitySetName = @tbl
) aep
where seqnum = 1;
这将值设为每行一个。如果您希望将它们放在一行上,则可以使用条件聚合进行转动或使用。