2017-02-28 40 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

相關問題