链接到审核表

时间:2019-06-11 20:25:37

标签: sql-server

所以我有dbo.Table1,其中包含ID,ColA,ColB,ColC。

我也有audit.Table1,其中包含AuditID,AuditDate,AuditUserID,AuditType,ID,ColA,ColB,ColC。

AuditType是I,U或D(用于插入,更新或删除)。

我要寻找的结果是一个查询,我根据where子句为我提供Table1中的每个记录,还为我提供了从audit.Table1表中提取的Last Modified信息(最新的“ U”值用于ID),主要是我想要日期和AuditUserID,因此我可以通过so&so用户拉出一个关于此类日期的基本Last Modified。

我尝试使用Cross Apply,但是当查询在30秒后仍在运行时,我就停止了这种想法。

在某些情况下,没有'U'记录(仅创建记录,未进行任何更改)。

2 个答案:

答案 0 :(得分:0)

目前还不清楚您正在做什么。但可以肯定的是,您可以沿这些方式使用某些东西。

create table Table1
(
    ID int identity
    , ColA varchar(10)
    , ColB varchar(10)
    , ColC varchar(10)
)

insert Table1
select 'Col1', 'Col2', 'Col3'

insert Table1
select 'This', 'has', 'no update'

create table AuditTable1
(
    AuditID int identity
    , AuditDate datetime
    , AuditUserID int
    , AuditType char(1)
    , ID int
    , ColA varchar(10)
    , ColB varchar(10)
    , ColC varchar(10)
)

insert AuditTable1
select getdate()
    , 9 --just some number
    , 'U'
    , 1
    , 'Col1'
    , 'Col2'
    , 'Col3'

select t.*
    , x.AuditID
    , x.AuditDate
    , x.AuditUserID
from Table1 t
outer apply
(
    select top 1 AuditID
        , AuditDate
        , AuditUserID
    from AuditTable1 at1
    where at1.ID = t.ID
    order by at1.AuditDate desc
) x

答案 1 :(得分:0)

因此,在进一步研究之后,我可以通过创建一个过渡的左联接使所有工作正常进行,该联接只给了我最后一个被触摸条目的AuditID#...并且如果AuditUserID在我的左联接中为null,则我知道自创建以来尚未对其进行修改。所以我的最终查询基本上是...

SELECT [fields wanted from Courses table],
IIF(ISNULL(ac.AuditUserID,0) = 0, [make created by info], [make modified info]) as LastModInfo
FROM dbo.Courses c
    LEFT JOIN (select MAX(AuditID), CourseID from audit.Courses group by CourseID) mid
        ON mid.CourseID = c.CourseID
    LEFT JOIN audit.Course ac on ac.AuditID = mid.AuditID AND ac.AuditType = 'U'

感谢@seanlange的尝试