Вопрос

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

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

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

Это было полезно?

Решение

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

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

Вы должны попытаться удалить все дубликаты записи, кроме одной, за исключением столбца идентификатора в вашем сравнении. Я предлагаю самый простой способ сделать это - сделать запрос рабочей таблицы ко всем уникальным значения (выберите «Различить поле 1, поле 2 ... из MyTable») для каждого поля , кроме для поля идентификатора, используя результаты в a для создания новой таблицы из примерно 2000 записей (если половина дубликаты).

Затем создайте столбец идентификатора в новой таблице, используйте запрос на обновление, чтобы обновить этот идентификатор до первого соответствующего идентификатора в исходной таблице (это можно сделать с помощью DLookup , , который возвратит первое значение EXPRESSION, где CRITERIA имеет значение true в DOMAIN ).

  

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

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

Другие советы

Используйте выбор со всеми столбцами, кроме столбца идентификатора:

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
    )

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top