Удаление дубликатов в Access 2003

У меня есть таблица Access 2003 с ~ 4000 записями, которая была сделана из 17 разных таблиц. Примерно половина этих записей-дубликаты. Нет уникального идентифицирующего столбца (id, name и т. д.). Существует столбец id, который был автоматически заполнен, когда таблицы были объединены, что означает, что дубликаты не полностью идентичны (хотя этот столбец может быть удален, если это упрощает дело).

Я использовал мастер запросов Access Find Duplicates, который дает мне список дублированные записи, но не позволяют мне удалить их (серьезно, что толку в этом запросе, если я не могу их удалить?). Я попытался преобразовать сгенерированный запрос в запрос удаления, но это изменяет количество строк, которые он находит. Я бы изменил sql вручную, но это немного за пределами меня и составляет 7 строк.

кто-нибудь знает хороший способ избавиться от дубликатов?

5 ответов


причина, по которой запрос find duplicates не позволит вам удалить записи, заключается в том, что это в основном просто агрегированный запрос, он подсчитывает количество найденных дубликатов и возвращает случаи, когда количество больше 1.

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

вы должны попробуйте удалить все дубликаты записи, кроме одного, исключая столбец ID в вашем сравнении. Я предлагаю самый простой способ сделать это - сделать запрос make-table из всех уникальные значения (Выберите Distinct Field1, Field2... из MyTable) вместо этого для каждого поля за исключением для поля ID, используя результаты в a, чтобы создать новую таблицу около 2000 записей (если половина дубликатов).

затем создайте столбец ID в новой таблице, используйте обновление запрос на обновление этого идентификатора до первого совпадающего идентификатора в исходной таблице (вы можете сделать это с помощью функции dlookup, который вернет первое значение выражения, где критерии истинны в домене).

функция DLookup () возвращает один значение одного поля, даже если больше чем одна запись удовлетворяет критерий. Если никакая запись не удовлетворяет критерии, или если домен не содержит records, DLookup () возвращает Ноль.

поскольку вы идентифицируете первый соответствующий идентификатор на основе всех других полей, которые являются уникальными значениями, несопоставленные идентификаторы будут принадлежать дубликатам. Вы будете реверсировать отношение PK, идентифицируя первый соответствующий ключ с учетом набора уникальных полей. После этого вы должны установить ID как PK. Конечно, это предполагает, что идентификатор не имеет неотъемлемого значения, и вы не заботитесь о сохранении одного конкретного идентификатора для данной дублированной строки над любым идентификатором, принадлежащим другие дублированные строки. Это предполагает, что вы заботитесь о данных в столбце ID, поэтому вы хотите сохранить его для всех оставшихся строк, иначе просто проигнорируйте шаг DLookup и сделайте Select Distinct для всех столбцов, кроме ID.


используйте select со всеми столбцами, кроме столбца ID:

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE

вы можете просто поменять названия.

Это решение даст вам новую таблицу с не дубликатами.


следующее сохранит исходные идентификаторы и сделает это за один шаг:

DELETE FROM table_with_duplicates 
WHERE table_with_duplicates.id NOT IN 
    (SELECT max(id) 
    FROM table_with_duplicates 
    GROUP BY duplicated_field_1, duplicated_field_2, ...
    )

теперь у вас есть исходная таблица без дубликатов и сохраненных идентификаторов. И всегда помните о резервном копировании данных перед попыткой больших удалений.


DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In 
    (SELECT max(ID) 
     FROM table_with_duplicates 
     GROUP BY [duplicated_field_1] 
     HAVING Count(*)>1
    )

на самом деле я нашел очень простое решение, потребовалось некоторое время, но все ваши поля одинаковы, как полная дублирующая запись, а затем просто сделайте один запрос с каждым полем и отсортируйте по "Group BY". Таким образом, дубликаты будут объединены, и вы можете просто добавить эту информацию в новую таблицу и переименовать ее так же, как существующую таблицу. Если у вас есть поле первичного ключа, вы можете просто проигнорировать его в запросе, а затем он все равно объединит данные (при условии, что вас не волнуют данные в первичном поле). Я не знаю, почему никто не упомянул, что это решение заняло у меня 5 часов. чтобы придумать. :)