2013-03-21 58 views
1

我想建立一個簡單的數據庫,用於跟蹤的任何更改到用戶的位置屬性。每天我生成用戶,日期,位置的當前信息並上傳到sql server中的臨時表。我試圖找出正確的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,日期,位置),並且每天都會添加新行,並更改信息。到目前爲止,我的新用戶sql是唯一可靠工作的。有沒有更簡單的方法來做到這一點?

+0

在哪些方面你的第二個和第三個查詢不符合您的期望? – Melanie 2013-03-21 21:09:34

+0

對於位置,位置是否可能爲NULL(並且UserGuid不是NULL)?無論是在新的結果還是舊的結果? – 2013-03-21 21:10:49

+0

我認爲我的主要問題是,在刪除和位置更改的情況下,我只需要查看用戶guid的最近位置...用戶guid可能會隨着其位置更改而出現在主表中多次(並可能改回到以前的位置)。它不可能爲用戶guid或位置爲空...如果userguid存在於每日表中它將有一個位置。我還需要處理這種情況,如果用戶以前被刪除,但隨後在日常表格中重新出現...... – NoThanks 2013-03-22 13:37:02

回答

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 
0

關於你的第二查詢嘗試:

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

我傾向於使用存在這些各種各樣的檢查

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

我包含在你的位置可能是空的事件ISNULL檢查;如果這是不可能的,他們不需要。