ユーザーの場所属性の変更を追跡する単純なデータベースを構築しようとしています。毎日、ユーザー、日付、場所の現在の情報を生成し、SQL サーバーの一時テーブルにアップロードします。新しいユーザー、変更されたユーザー、および削除されたユーザーを照会するための正しいSQLを見つけようとしています。
新しいユーザーを見つけるのは簡単です:
SELECT table1.UserGuid,table1.Location
FROM table1
WHERE table1.UserGuid NOT IN
(
SELECT DISTINCT table2.UserGuid
FROM table2
)
私が抱えている問題は、変更された場所と削除されたユーザーを見つけることです。
変更されたユーザーの場合、データベース内の最後の場所が毎日の一時データベースの現在の場所と一致しないユーザーを返そうとしています。これは私が持っているものですが、正しいとは思いません:
SELECT table1.UserGuid,table1.Location
FROM table1
WHERE EXISTS
(
SELECT TOP 1 table2.UserGuid,table2.Location
FROM table2
WHERE (table2.UserGuid = table1.UserGuid) AND (table2.Location != table1.Location)
ORDER BY table2.Date DESC
)
削除されたユーザーの場合、次のSQLを実行して、メインテーブル内のユーザーのうち、日次一時テーブルに存在せず、削除された場所がないユーザーを特定しようとしています。(これにより削除されたユーザーが返された場合は、削除された場所でメインテーブルに追加して、次回は返されないようにします)
SELECT table2.UserGuid,table2.Location
FROM table2
WHERE table2.UserGuid NOT IN
(
SELECT UserGuid
FROM table1
)
AND table2.Location != 'deleted'
3 つのクエリをすべて実行して追加、変更、および削除を見つけた後、それらを現在の日付と共にメイン テーブルに追加し、翌日に繰り返します。したがって、メイン テーブルには 3 つの列 (UserGuid、Date、Location) があり、変更された情報を含む新しい行が毎日追加されます。これまでのところ、確実に機能しているのは私の新しいユーザーsqlだけです。これを行う簡単な方法はありますか?