这是我的表结构
表格 - 用户
COLUMNS - USERID~CREATEDON~ ...
表格 - 审核
COLUMNS - AUDITID~OBJECTID~ACTION~ ...
审核用户 - 1:N(USERID到OBJECTID)
我正在尝试提出一个查询,该查询返回所有审核条目的操作值为64或65(在过去6个月之后的某个时间点)或的用户有64或65。
以下是我的想法:
DECLARE @monthsInactiveFor INT
SET @monthsInactiveFor = -6
SELECT USR.fullname,
USRID.last_logged_in_date
FROM systemuser AS USR
INNER JOIN (SELECT DISTINCT AB.objectid AS USERID,
Max(AB.createdon) AS LAST_LOGGED_IN_DATE
FROM systemuserbase AS USR
LEFT OUTER JOIN auditbase AS AB
ON USR.systemuserid = AB.userid
WHERE ( AB.action = 64 )
OR ( AB.action = 65 )
GROUP BY AB.objectid
HAVING ( Max(AB.createdon) <=
Dateadd(month, @monthsInactiveFor,
Getdate()) )) AS USRID
ON USR.systemuserid = USRID.userid
WHERE ( USR.isdisabled = 0 )
AND ( USR.createdon <= Dateadd(month, @monthsInactiveFor, Getdate()) )
AND ( USR.accessmode = 0 )
ORDER BY USR.fullname
上述查询工作正常,并返回所有记录,这些记录具有64或65的审核表行,这些记录在过去6个月内未创建。
我很难同样查询没有审核条目的用户,其ACTION列值为64或65.
赞赏任何正确方向的指针。
答案 0 :(得分:2)
只有3个逻辑人群:
你想要第1组和第3组。除了第2组中的人之外,每个人都是。所以转向逻辑:如果审计事件的Max CreatedOn是过去6个月,那么你不< / strong>想要那个用户。你想要其他人。
答案 1 :(得分:0)
结束了UNION来获取所有记录,因为查询也更具可读性,欢迎任何优化建议:
"Hello"