2013-03-21 57 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检查;如果这是不可能的,他们不需要。