2017-02-28 2 views
1

私は2つのテーブルを持っています。これは、誰かが建物のどこかにその鍵を使用した最後の時間を示してSQLで一致しないレコードのリストを見つける方法は? (何か問題があります)

  • ユーザーID
  • LastAccessTime

: -

ユーザーは、これらの列を持つユーザーごとに1行があります。

イベント - これらの列ですべてのイベントをログに記録し、ユーザーごとに複数の行があります。

  • イベントID
  • イベント時刻
  • ユーザーID
  • これはすべてのインスタンスを示し

をEventTypeID誰かがキーを使用した場所。 EventTypeIDが70の場合は、誰かが建物に入るか、「時計入力」します。

私は、自分のキーを使用しているが、キーを使用して特定の日にエントリーを登録していない人を示すクエリを作成しようとしています。

以下は、これを適切に行っているユーザーのためにtrueになります。

  • Users.LastAccessTime>「2017年2月28日」(別名今日の日付)Events.EventTypeIDの
  • 最新の場合= 70は同じ行にEvents.EventTime> '2017-02-28'を持っています

しかし、私が必要とするのは建物のルールに従わない人のリストです。

ありがとうございました。あなたがテーブルを結合し、私はあなたの質問を理解している場合

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

は、私はあなたがこのクエリを探していると思います:

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())); 

私が2つのテーブルを結合するために使用した最初の条件。 と私が使用した他の条件は、それらの間にORと起こったはずのものの反対です。その結果、1つまたは複数の条件に従わなかったユーザがいる場合、彼はクエリによって選択されます。

+0

これは素晴らしく働いた、ありがとう! – Conk1

0

あなたのルールを満たすイベントテーブル内のレコードを持っていないユーザーIDを取得する必要があります

+0

これは残念なことに、しかし私の説明のためにおそらく動作しませんでした。私はすべての条件が満たされないようにする必要があったので、ORの代わりにANDを必要としました。しかし、もう一度、助けていただきありがとうございます! – 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の代わりにANDを必要としました。しかし、あなたの時間をありがとう! – Conk1

1

あなたの質問はNOT EXISTSまたはNOT 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

関連する問題