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

如果您的位置可能为空,我包括 ISNULL 检查;如果不可能,就不需要它们。

于 2013-03-21T21:15:30.407 回答
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
)
于 2013-03-21T21:12:13.813 回答
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 回答