2013-03-21 3 views
1

Я пытаюсь создать простую базу данных, которая отслеживает любые изменения атрибута местоположения пользователей. Каждый день я генерирую текущую информацию о пользователе, дату, местоположение и загружаю во временную таблицу на сервере sql. Я пытаюсь выяснить правильный sql для запроса для новых пользователей, измененных пользователей и удаленных пользователей.Добавление ежедневных изменений в таблицу базы данных

Поиск новых пользователей легко с:

SELECT table1.UserGuid,table1.Location 
FROM table1 
WHERE table1.UserGuid NOT IN 
(
    SELECT DISTINCT table2.UserGuid 
    FROM table2 
) 

Проблема Я имею в поиске измененных мест и удаленных пользователей.

Для измененных пользователей я пытаюсь вернуть пользователей, где их последнее местоположение в базе данных не соответствует текущему местоположению в ежедневной базе данных temp. Это то, что я имею, но я не думаю, что это правильно:

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 - единственный, который работает надежно. Есть ли более простой способ сделать это?

+0

Каким образом ваши второй и третий запросы не соответствуют вашим ожиданиям? – Melanie

+0

Для местоположений, возможно ли, чтобы местоположение было NULL (и UserGuid не было NULL)? Либо в новых результатах, либо в старых результатах? –

+0

Я думаю, что моя главная проблема заключается в том, что в случае удаления и изменения местоположения мне нужно только посмотреть на самое последнее место для пользовательского руководства ... пользовательский указатель может появляться много раз в главной таблице по мере изменения их местоположения (и, возможно, изменения в предыдущем месте). его невозможно, чтобы пользовательский указатель или местоположение были нулевыми ... если userguid существует в ежедневной таблице, он будет иметь местоположение. Мне также нужно обработать случай, когда пользователь был ранее удален, а затем снова появляется в ежедневной таблице через некоторое время ... – NoThanks

ответ

0

So I думаю, это отражает все ваши требования.

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 в случае ваше местоположение может быть нулевым; они не нужны, если это невозможно.

Смежные вопросы