2017-02-28 38 views
1

我有2张桌子。如何在SQL中查找不匹配的记录列表? (有些麻烦)

用户 - 具有每用户1排,这些列:

  • 用户名
  • 的LastAccessTime

这显示最后一次有人使用他们的关键某处大楼。

活动 - 有每个用户的多行,将记录这些列的每一个事件:

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

这说明每一个实例有人使用他们的钥匙。 当某人进入建筑物或“加入时钟”时,EventTypeID为70。

我试图做一个查询,显示谁使用他们的密钥,但没有使用他们的密钥在某一天注册他们的入口的人。

下面将是谁这样做了正确的用户真正:

  • Users.LastAccessTime>“2017年2月28日”(又名今天的日期)
  • 最近的情况Events.EventTypeID = 70也将在同一行Events.EventTime>'2017-02-28'

但我需要的是不遵守建筑规则的人员列表。

感谢您提前给予任何帮助。

+1

规则不明确。请尝试添加一些数据样本集。 –

回答

1

您需要联接表,并得到没有在活动表中的记录满足您的规则

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()) 
+0

这工作出色,谢谢! – Conk1

0

如果我明白你的问题,我认为你正在寻找此查询的用户ID:

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。所以如果有一个用户不服从一个或多个条件,他将被查询选中。

+0

这不起作用,但可能是因为我的解释。我需要所有的条件不被满足,所以,而不是OR。但再次感谢,感谢帮助! – Conk1

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 
+0

这不起作用,但可能是因为我的解释。我需要所有的条件不被满足,所以,而不是OR。但是,谢谢你的时间! – Conk1

1

你的问题建议NOT EXISTSNOT IN。我认为这是你想要的逻辑:

用户。的LastAccessTime>“2017年2月28日”(又名今天的日期) 最近Events.EventTypeID的情况下= 70也会有Events.EventTime>“2017年2月28日”同一行

select u.* 
from users u 
where u.LastAccessTime > cast(getdate() as date) and -- in the building today 
     not exists (select 1 
        from events e 
        where e.UserId = u.UserId and 
         e.EventTypeID = 70 and 
         e.EventTime > cast(getdate() as date) 
       ); 

这返回今天进入但今天没有活动70的人。

+0

这也很好,谢谢! – Conk1

相关问题