查询存在和不存在的位置

时间:2018-05-14 21:52:11

标签: sql sql-server

这是我的表结构

表格 - 用户

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.

赞赏任何正确方向的指针。

2 个答案:

答案 0 :(得分:2)

只有3个逻辑人群:

  1. 最近64/65审核事件超过6个月之前的人
  2. 最近64/65审核事件不到6个月前的人
  3. 没有64/65审核事件的人
  4. 你想要第1组和第3组。除了第2组中的人之外,每个人都是。所以转向逻辑:如果审计事件的Max CreatedOn是过去6个月,那么你不< / strong>想要那个用户。你想要其他人。

答案 1 :(得分:0)

结束了UNION来获取所有记录,因为查询也更具可读性,欢迎任何优化建议:

"Hello"