1

ユーザーの場所属性の変更を追跡する単純なデータベースを構築しようとしています。毎日、ユーザー、日付、場所の現在の情報を生成し、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だけです。これを行う簡単な方法はありますか?

4

3 に答える 3

0

私はこの種のチェックにEXISTSを使用する傾向があります

    --INSERTS
    SELECT table1.UserGuid,table1.Location
    FROM table1
    WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE table2.UserGuid = table1.UserGuid)
    UNION ALL
    --UPDATES
    SELECT table1.UserGuid,table1.Location
    FROM table1
    WHERE EXISTS 
    (
        SELECT 1 FROM table2 
        WHERE table2.UserGuid = table1.UserGuid 
        AND ISNULL(table2.Location,'') <> ISNULL(table1.Location,'')
    )
    UNION ALL
    --DELETES
    SELECT table2.UserGuid,table2.Location
    FROM table2
    WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE table2.UserGuid = table1.UserGuid)

あなたの場所がnullになる可能性がある場合に備えて、ISNULLチェックを含めました。それが不可能な場合は必要ありません。

于 2013-03-21T21:15:30.407 に答える
0

したがって、これですべての要件が満たされると思います。

    Select 
table1.*,
    case when table2.userguid is null then 'INSERT'
    when table1.userguid is null and table2.location != 'deleted' then 'DELETE'
    when table1.location != table2.location then 'UPDATE'
     from table1
    full join (select max(date) as lastEntry, userGuid from Table2) lastRecords
    inner join table2 on table2.date = lastRecords.lastEntry and table2.userGuid = lastRecords.userGuid
     on lastRecords.userguid = table1.userguid
于 2013-03-21T21:11:41.990 に答える
0

2 番目のクエリでは、次を試してください。

SELECT table1.UserGuid,table1.Location
FROM table1
WHERE table1.UserGuid IN
(
  SELECT table2.UserGuid
  FROM table2
  WHERE table2.UserGuid = table2.UserGuid AND table2.Location <> table2.Location
)
于 2013-03-21T21:12:13.813 に答える