从分离的值中形成表的记录?

时间:2017-07-10 13:20:09

标签: sql sql-server tsql

*对不起,我找不到更好的问题标题

我正在实施审核功能,目前正在使用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' ) 的所有历史记录。

我需要的是我想要实现用户可以在特定时间返回特定记录的功能。 我用油漆画了它,它描绘了这个想法:

enter image description here

第一行是插入状态,第二行是Idcol1上的编辑,第三行是编辑col2col1等等。 col3是主键,因此每次都插入它(它的值不会改变!)

现在最近的记录是mod6,我需要回到mod3,所以我将从mod3获取col1值,从mod2获取col1值,{{1来自mod3,来自mod1的col2

我的问题是如何在特定col3的表col4中形成TbCountries类型的完整记录?

1 个答案:

答案 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;

这将值设为每行一个。如果您希望将它们放在一行上,则可以使用条件聚合进行转动或使用。