【问题标题】:Access SQL Query Help Using Not Exists使用 Not Exists 访问 SQL 查询帮助
【发布时间】:2011-02-10 17:54:05
【问题描述】:

我有一个名为 sys_event_log 的表,其中包含以下列:

用户名, 事件类型, 事件消息, 时间戳

使用“登录成功”或“注销事件”的 event_type 跟踪登录和注销事件

在 Access 中使用 SQL 我试图根据事件日志 event_types 和 time_stamps严格返回已登录到数据库但尚未注销的不同用户的列表。

到目前为止我提出的查询是:

SELECT DISTINCT
     a.user_name,
     a.event_type,
     a.time_stamp
FROM
     sys_event_log a
WHERE NOT EXISTS
 (
     SELECT
          1
     FROM
          sys_event_log b
     WHERE
          b.time_stamp > a.time_stamp 
          AND a.user_name = b.user_name 
          AND a.event_type = "Logout Event"
 )
AND a.event_type = "Login Success";

感觉很接近,但没有返回预期的数据集。

【问题讨论】:

  • 如果您允许同一用户同时进行多个连接,这是否可以正常工作?
  • @ypercube 这有关系吗?如果发生这种情况,有 2 个结果(1)最后一个条目是注销 => 用户未列出(2)在最后一个注销后有多个登录 => 用户多次列出 每次登录一次
  • 所以,如果我们在 event_log 中有: login, login, login, logout ,那么当他仍然有 2 个活动登录时,用户不会被列出。对吗?
  • 回答问题。是的。可以多次打开应用程序...但他们必须从共享目录中创建多个副本才能这样做。

标签: sql ms-access


【解决方案1】:
  SELECT a.user_name
       , COUNT(*) AS logins
       , ( SELECT COUNT( b.time_stamp ) 
             FROM sys_event_log b 
             WHERE b.user_name = a.user_name
               AND b.event_type = "Logout Event"
          ) AS logouts
       , logins - logouts AS activeConnections
    FROM sys_event_log a
    WHERE a.event_type = "Login Success"
    GROUP BY a.user_name
    HAVING logins > logouts

【讨论】:

  • 我肯定会保存这个查询。多个同时连接的问题从来都不是一个主要问题。在大多数情况下,用户不知道如何实现这样的目标,他们也不想这样做,但我现在可以看到它可能会导致问题。
  • 因为最终目标是能够确定是否/谁在每个人都需要断开连接的时候主动连接到应用程序(比如我需要进行数据库更新,我们无法确定哪个25 个用户中仍然保持连接,事实证明他在度假时没有打开计算机,真实故事)通过做一个简单的更改(活动连接数 > 0)我相信这应该可以工作。
【解决方案2】:

试试这个:

SELECT 
   a.user_name, 
   a.event_type, 
   a.time_stamp
FROM
   sys_event_log a
WHERE a.event_type = "Login Success" AND
   a.time_stamp = ( SELECT MAX( b.time_stamp ) 
                    FROM sys_event_log b 
                    WHERE b.user_name = a.user_name )

【讨论】:

  • 我相信也会这样做。我必须对其进行测试,但逻辑看起来很可靠。
  • 通过在子查询中使用条件 b.time_stamp > a.timestamp,您的效率更高。我的版本可以通过在子查询中添加 b.time_stamp >= a.time_stamp 来改进。
  • 查看针对问题的评论 - 这会改变所评论的查询的含义,一旦您涉及登录/注销之外的其他 event_types,它将无法工作。
【解决方案3】:

如果你使用它会更有意义

b.event_type = "Logout Event"

这里

      b.time_stamp > a.time_stamp 
      AND a.user_name = b.user_name 
      AND a.event_type = "Logout Event"

【讨论】:

  • 明显的错误总是最糟糕的......我想我只是需要别人来看看它!谢谢(不会让我接受 8 分钟作为答案)
  • @cyberwiki:我认为上述查询还有一个缺陷。当用户可以建立许多(同时)连接时,它就不能很好地工作。
猜你喜欢
  • 2016-07-26
  • 2016-07-22
  • 2013-02-13
  • 1970-01-01
  • 2015-04-01
  • 2016-10-14
  • 1970-01-01
  • 2021-03-02
  • 2019-03-01
相关资源
最近更新 更多