Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Базы данных > SQL
Перезагрузить страницу Access: запрос на удаление повторяющихся записей
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
iusovich iusovich вне форума
Member
 
Сообщений: 38
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.03.2006
По умолчанию Access: запрос на удаление повторяющихся записей - 02.06.2006, 13:44

Есть таблица из трёх полей (формат: длинное целое). Столбцы: магазин, чек, категория_товара.
Нужно удалить полностью повтояющиеся записи, то есть те, для которых значения по всем трём столбцам совпадают. Всмысле, удалить повторы, оставив только одну запись из множества идентичных.

Буду благодерен за идеи.
Ответить с цитированием
  (#2 (permalink)) Старый
iusovich iusovich вне форума
Member
 
Сообщений: 38
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.03.2006
По умолчанию Access: запрос на удаление повторяющихся записей - 02.06.2006, 13:44

Есть таблица из трёх полей (формат: длинное целое). Столбцы: магазин, чек, категория_товара.
Нужно удалить полностью повтояющиеся записи, то есть те, для которых значения по всем трём столбцам совпадают. Всмысле, удалить повторы, оставив только одну запись из множества идентичных.

Буду благодерен за идеи.
Ответить с цитированием
  (#3 (permalink)) Старый
PerfectStranger PerfectStranger вне форума
Member
 
Сообщений: 240
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 07.06.2006, 13:47

Обязательно нужно уникальное поле - поэтому надо добавить в Access в таблицу поле счетчик - пусть занумерует записи.
Дальше так:
Код:
DELETE FROM Таблица1 WHERE ID NOT IN (
  SELECT MIN(ID) FROM Таблица1
    GROUP BY магазин, чек, категория_товара
)
Т.е. выбираем из дублей c минимальным ID (можно с максимальным), и удаляем все другие.

ЗЫ: вообще-то SQL плохо оперирует с полными дублями по всем полям записям - сама идея языка такова, что для него это одни и те же записи.
Ответить с цитированием
  (#4 (permalink)) Старый
iusovich iusovich вне форума
Member
 
Сообщений: 38
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.03.2006
По умолчанию 07.06.2006, 14:19

Спасибо, запрос работает. Только очень долго. У меня 13 таблиц по 40-50 тысяч записей . Если SQL не очень подходит, не намекнёте, в чём можно реализовать подобную процедуру? Пробовал VBA в Excel, простой макрос записывающий в 3-х мерный массив, а затем сравнивающий его элементы - НЕВЕРОЯТНО долго. SQL всё же быстрее.

Спасибо большое за совет!
Ответить с цитированием
  (#5 (permalink)) Старый
PerfectStranger PerfectStranger вне форума
Member
 
Сообщений: 240
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 07.06.2006, 15:13

По поводу удаления дублей - можно попытаться упорядочить (при помощи того же SQL) записи по полям, по которым требуется уникальность, и пробежаться по результату в VBA, сравнивая значения у этих полей у текущей записи со значениями предыдущей записи (их в конце каждого прохода цикла нужно сохранить в переменные, а перед циклом проиницилизировать значениями, которых точно нет в таблице - может значения -1 подойдут). Если значение совпадает с предыдущей - удаляем запись. НО: 1) не уверен, что это будет быстрее работать, чем запрос, приведенный выше; 2) не знаю как написать такое на VBA-Access (я с Access'ом вообще слабо знаком).

Можно еще попробовать, если на таблицу никто не ссылается, через другую таблицу. Сделать
Код:
INSERT INTO Table2(Field1, Field2, Field3)
  SELECT DISTINCT Field1, Field2, Field3 FROM Table1
(DISTINCT выбирает записи уникально). Затем убрать все в исходной таблице, и перенести в нее значения из Table2. Тоже, правда не уверен, что быстрее будет - но здесь шансов поболее, что все же пошустрее отработает.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
iusovich iusovich вне форума
Member
 
Сообщений: 38
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.03.2006
По умолчанию 07.06.2006, 15:29

Потрясающе! Предложенный вами код сделал всё за 30 секунд. На выполнение прошлого запроса ушло 1,5 часа. Спасибо Вам большое, теперь всё легко сделаю!
Ответить с цитированием
  (#7 (permalink)) Старый
DarkLord
Guest
 
Сообщений: n/a
По умолчанию 14.04.2008, 01:20

Доброе время суток!

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

Имеется таблица, содержащая 6 полей - field1..field6
Необходимо удалить повторы, которые определяются полями 2,3 и 5. Остальные поля несущественны для отбора, но должны присутствовать в получаемой таблице.
Т.е. если поля 2,3,5 совпадают, то мы считаем эту запись "повтором", и неважно, какие значения в остальных полях.

Делаю так:
INSERT INTO Table2
SELECT DISTINCT field2, field3, field5
FROM Table1

Затем очищаю Table1:
DELETE * FROM Table1

Копирую отобранные записи обратно:
INSERT INTO Table1 SELECT * FROM Table2

В результате получаю Table1 с уникальными записями, но поля 1,4 и 6 пустые.

Собственно вопрос: как добиться заполнения этих полей, чтобы они не влияли на результаты отбора, а просто копировались?


P.S. Извиняюсь за "некропостинг", но имхо это лучше, чем плодить кучу похожих тем
Ответить с цитированием
  (#8 (permalink)) Старый
Philin Philin вне форума
Member
 
Сообщений: 75
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.10.2004
По умолчанию 25.05.2008, 10:38

INSERT INTO Table2
SELECT field2, field3, field5,
min(field1), min(field4), min(field6)
FROM Table1
GROUP BY field2, field3, field5
Ответить с цитированием
  (#9 (permalink)) Старый
Jonubek1983 Jonubek1983 вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.06.2008
Unhappy 12.06.2008, 17:35

Цитата:
Доброе время суток!

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

Имеется таблица, содержащая 6 полей - field1..field6
Необходимо удалить повторы, которые определяются полями 2,3 и 5. Остальные поля несущественны для отбора, но должны присутствовать в получаемой таблице.
Т.е. если поля 2,3,5 совпадают, то мы считаем эту запись "повтором", и неважно, какие значения в остальных полях.

Делаю так:
INSERT INTO Table2
SELECT DISTINCT field2, field3, field5
FROM Table1

Затем очищаю Table1:
DELETE * FROM Table1

Копирую отобранные записи обратно:
INSERT INTO Table1 SELECT * FROM Table2

В результате получаю Table1 с уникальными записями, но поля 1,4 и 6 пустые.

Собственно вопрос: как добиться заполнения этих полей, чтобы они не влияли на результаты отбора, а просто копировались?


P.S. Извиняюсь за "некропостинг", но имхо это лучше, чем плодить кучу похожих тем
Привет всем трудягам! (Access) Как удалить похожую запись, но при этом оставить одну запись орегинала!
Ответить с цитированием
  (#10 (permalink)) Старый
Jonubek1983 Jonubek1983 вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.06.2008
Cool 13.06.2008, 16:39

Цитата:
Обязательно нужно уникальное поле - поэтому надо добавить в Access в таблицу поле счетчик - пусть занумерует записи.
Дальше так:
Код:
DELETE FROM Таблица1 WHERE ID NOT IN (
  SELECT MIN(ID) FROM Таблица1
    GROUP BY магазин, чек, категория_товара
)
Т.е. выбираем из дублей c минимальным ID (можно с максимальным), и удаляем все другие.

ЗЫ: вообще-то SQL плохо оперирует с полными дублями по всем полям записям - сама идея языка такова, что для него это одни и те же записи.
Большое вам спасибо! за этот важнейший кодик! он очень мне помог! очень благодарен!
немного долговато но работает на ура!
Ответить с цитированием
  (#11 (permalink)) Старый
gastat gastat вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.05.2013
По умолчанию 30.05.2013, 12:24

Подскажите, пожалуйста, как можно изменить данный код, чтобы удалялись обе совпадающие записи и оставались только те, у которых дублей не найдено?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление повторяющихся элементов Friz Prolog 1 22.12.2010 00:05
Access как поместить запрос на удаление записи AlexanderSYBD Другие СУБД 1 30.07.2009 12:41
Удаление автоматом записей в реестре Chek Софт и программы 3 10.05.2008 07:51
Добавление записей в Access Dr.Fill .NET 7 21.11.2007 21:54
Автоматическое удаление одинаковых записей _kT SQL 2 06.08.2007 11:21
Удаление повторяющихся строк в Excel с предварительным суммированием addim Visual Basic 8 13.07.2006 14:35
Удаление связаннных записей TOPT SQL 2 17.12.2005 17:44
Удаление записей из таблицы Dimson C++ Builder 0 20.10.2005 21:58
Удаление повторяющихся элементов. imported_director Prolog 8 12.10.2005 18:56
Проверка одинаковых записей в DB Access Славик Visual Basic 1 22.06.2005 13:28
Удаление повторяющихся записей в Excel OKey Visual Basic 2 29.03.2004 13:40
Удаление записей помеченные на удаление в связке BCB-dbf mr_Driver C++ Builder 1 05.09.2003 10:31



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов