Как удалить несколько дубликатов на основе даты в MS Access - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица имен и дат. Я хочу удалить строки, имеющие дубликаты имен, и сохранить только ту, которая содержит самую последнюю дату. Иногда встречается несколько повторяющихся строк информации.

Мой код, приведенный ниже, работает, однако я хотел бы запустить автоматический цикл, который останавливается, когда больше не обнаруживаются дубликаты, ИЛИ не изучает лучший / более эффективный способ сделать это.

С кодом ниже моя текущая процедура:

Query1 Query2 Query3

Повторяйте, пока больше не будет удалено дубликатов.

Table1:

ID  Field1  Field2  Field3
3   Albert  Jacobsen 12/5/2018
5   Mia     Shaw     12/28/2018
6   Chris   Mantle   6/14/2018
7   Albert  Jacobsen 1/8/2019
8   Albert  Jacobsen 11/15/2018
9   Chris   Mantle   11/24/2018

Query 1:
SELECT Table1.Field1, Table1.Field2, Table1.Field3, Table1.ID INTO Table2
FROM Table1
GROUP BY Table1.Field1, Table1.Field2, Table1.Field3, Table1.ID
ORDER BY Table1.Field1 DESC , Table1.Field2 DESC , Table1.Field3 DESC;

Table2:
Field1  Field2  Field3  ID
Mia     Shaw     12/28/2018 5
Chris   Mantle   11/24/2018 9
Chris   Mantle   6/14/2018  6
Albert  Jacobsen 1/8/2019   7
Albert  Jacobsen 12/5/2018  3
Albert  Jacobsen 11/15/2018 8

Query 2:
SELECT Table2.Field1, Table2.Field2, Count(Table2.ID) AS CountOfID,                 
Min(Table2.ID) AS MinOfID INTO Temp_DeleteThese
FROM Table2
GROUP BY Table2.Field1, Table2.Field2
HAVING (((Count(Table2.ID))>1));

Table Temp_DeleteThese:
Field1  Field2  CountOfID MinOfID
Albert  Jacobsen 3  3
Chris   Mantle   2  6

Query 3:
DELETE DISTINCTROW Table1.*
FROM Temp_DeleteThese INNER JOIN Table1 ON Temp_DeleteThese.MinofID =             
Table1.ID;

Resulting Table1:
ID  Field1  Field2  Field3
5   Mia Shaw     12/28/2018
7   Albert  Jacobsen 1/8/2019
8   Albert  Jacobsen 11/15/2018
9   Chris   Mantle   11/24/2018

Как зациклить код, пока не будут удалены дубликаты и сохранена только самая последняя запись, или сделать это более эффективно?

1 Ответ

0 голосов
/ 09 января 2019

Вы можете удалить все повторяющиеся записи в одном запросе, используя подзапрос EXISTS, чтобы убедиться, что существует строка с тем же именем и более поздней датой:

DELETE *
FROM Table1 t
WHERE EXISTS(
    SELECT 1
    FROM Table1 s
    WHERE s.Field1 = t.Field1
    AND s.Field2 = t.Field2
    AND s.Field3 > t.Field3
)

При этом удаляются все строки, которые должны быть удалены за один раз. Я не думаю, что вы можете стать более эффективным, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...