如何在SQL中查找不匹配的记录列表? (遇到麻烦)

时间:2017-02-28 11:21:17

标签: sql sql-server

我有2张桌子。

用户 - 每位用户拥有1行,其中包含以下列:

  • 用户ID
  • 的LastAccessTime

这显示了上次有人在建筑物的某处使用他们的钥匙。

事件 - 每个用户有多行,使用以下列记录每个事件:

  • 事件ID
  • EVENTTIME
  • 用户ID
  • EventTypeID

这显示了某人使用其密钥的每个实例。 EventTypeID为70表示某人进入建筑物或“进入”时。

我正在尝试进行查询,以显示正在使用其密钥但未使用其密钥在某一天注册其入口的人。

对于已正确完成此操作的用户,情况如下:

  • Users.LastAccessTime> '2017-02-28'(又名今天的日期)
  • Events.EventTypeID = 70的最新案例也将包含Events.EventTime> '2017-02-28'在同一行

但我需要的是一份不遵守建筑规则的人员名单。

感谢您提前提供任何帮助。

4 个答案:

答案 0 :(得分:1)

您需要加入表格并获取在活动表格中没有符合规则的记录的用户ID

SELECT Users.userID 
FROM Users
LEFT JOIN Events ON Users.userID = Events.UserID
    AND Events.EventTypeID = 70 
    AND Events.EventTime >= CONVERT(DATE, GETDATE())
WHERE EventID IS NULL 
    AND Users.LastAccessTime >= CONVERT(DATE, GETDATE())

答案 1 :(得分:1)

您的问题建议<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.1.60/inputmask/jquery.inputmask.js"></script> <td> <input value="A-45" id="piash"> </td>NOT EXISTS。我认为这是你想要的逻辑:

Users.LastAccessTime&gt; '2017-02-28'(又名今天的日期) 最近的Events.EventTypeID = 70的情况也将具有Events.EventTime&gt; '2017-02-28'在同一行

NOT IN

这会返回今天进入但今天没有事件70的人。

答案 2 :(得分:0)

如果我理解你的问题,我认为你正在寻找这个问题:

select * 
from Users as u,Event as e
where u.UserID=e.UserID and 
     (Users.LastAccessTime < CONVERT (date, GETDATE()) Or 
      Events.EventTypeID <> 70 or  
      Events.EventTime < CONVERT (date, GETDATE()));

我用来加入两个表的第一个条件。 和我使用的其他条件相反,它们之间应该发生OR。因此,如果有一个用户不遵守一个或多个条件,他将被查询选中。

答案 3 :(得分:0)

这是你想要的吗?

SELECT U.USERID FROM USERS U
LEFT JOIN EVENTS E
ON
U.USERID=E.USERID
WHERE (E.USERID IS NULL OR U.LastAccessTime <> '2017-02-28' OR E.EventTypeID <>70 OR E.EventTime <> '2017-02-28') --if any of the above condition is Violated, their ID will be dispalyed in the select clause