Запросы на удаление строки в Access

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Запросы на удаление строки в Access

Сообщение КсЮня » 03.08.2006 (Чт) 12:26

Помогите мне пожалуйста.
У меня есть огромный файл в Excel из 30 тысяч строк, из которого надо сделать БД. Там есть куча повторяющихся строк по определенным признакам и я должна с помощью БД удалить как-то все эти строки. Вроде как БД я сделала, разбила на маленькие таблички, сделала ключевое поле, типа код просто для каждой строчки. А потом когда начинаю делать группировку, если код этот не вставлять, мне группировку отлично делают, убираются полностью повторяющиеся строки, но теряется связь с этим колом и восстановить никак не могу. Если же код оставляю, то как было 30919 строк, так и остается.
Вопрос: Можно ли как то делать запрос, которые какие-то ячейски как-то проверяет и удаляет их, если одинаковые (но при этом остается связь с кодом).
Либо может мне какое-то ключевое поле другое сделать?
Заранее спасибо.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.08.2006 (Чт) 12:54

Проще сделать еще одну такую же таблицу и сделать в нее выборку:
Код: Выделить всё
insert into tbl2 (fld1, fld2 ...) select distinct fld1, fld2 ... from tbl1
Слово distinct означает неповторяющиеся записи. Ключевое поле в выборку естесственно не включать. Я правильно понял, что нужно избавиться от повторов?
Лучший способ понять что-то самому — объяснить это другому.

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Re: Запросы на удаление строки в Access

Сообщение Gloom » 03.08.2006 (Чт) 13:00

Можно и удалить строки с повторяющимися полями запросом типа этого:
Код: Выделить всё
DELETE *
FROM Таблица
WHERE Таблица.Код NOT IN (SELECT MIN(Таблица.Код) FROM Таблица GROUP BY Таблица.Данные1, Таблица.Данные2, ...)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.08.2006 (Чт) 13:11

Первый вариант проще и быстрее.
Да и в целом удобнее, если критерии отбора будут более сложными.
Lasciate ogni speranza, voi ch'entrate.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 03.08.2006 (Чт) 13:52

Antonariy
если я делаю, как ты пишешь, то у меня получается, что только fld1, fld2 из которых Distinct делаю копируются в новую таблицу, а остальные у меня не копируются. а мне надо с кодом, чтобы связь осталась, потому что это только первый шаг.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.08.2006 (Чт) 14:38

Повторами я считаю записи идентичные по всем полям. Скопируй таблицу и удали ключевое поле. Сделай выборки select * from и select distinct * from. Насколько отличаются количества возвращаемых записей?
Лучший способ понять что-то самому — объяснить это другому.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 03.08.2006 (Чт) 14:44

ээээ, подожди, а как это я без ключевого поля то??? а с остальными таблицами как я буду связывать потом с другими таблицами???

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.08.2006 (Чт) 14:54

Я же говорю скопируй и у копии удали ключ. А база нормализована чтоль? У подчиненных таблиц есть какие-то записи?

А вообще, если у тебя похожесть повторов плюс-минус трамвайная остановка, то пользуйся глумовским способом.
Последний раз редактировалось Antonariy 03.08.2006 (Чт) 15:02, всего редактировалось 2 раз(а).
Лучший способ понять что-то самому — объяснить это другому.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 03.08.2006 (Чт) 14:59

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.08.2006 (Чт) 15:05

Н-да, чистку нужно проводить до нормализации. Короче, пользуйся глумовским способом.
Лучший способ понять что-то самому — объяснить это другому.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 03.08.2006 (Чт) 15:10

это как???

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.08.2006 (Чт) 15:28

Как он написал. См второй ответ.
Лучший способ понять что-то самому — объяснить это другому.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 04.08.2006 (Пт) 10:59

Gloom
я короче написала этот запрос, только вот у меня комп что-то сильно призадумался, при его выполнении. видимо ни я ни комп не очень поняли выражение "NOT IN". можешь рассказть, что оно значит??

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.08.2006 (Пт) 11:28

Если таблица большая, то он и будет думать долго, подожди.
По смыслу запрос обозначает следующее.
УДАЛИТЬ
ИЗ Таблица
ДЛЯ Таблица.Код НЕ ВХОДЯЩИЙ В (ВЫБРАТЬ МИНИМАЛЬНОЕ_ЗНАЧЕНИЕ(Таблица.Код) ИЗ Таблица СГРУППИРОВАВ ПО ...)

Т.е. удалить все неуникальные коды, оставив только первый код неуникальной серии.
Lasciate ogni speranza, voi ch'entrate.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Re: Запросы на удаление строки в Access

Сообщение Summer.05 » 17.08.2006 (Чт) 21:14

Меня заинтересовал ход твоей мысли :)

Gloom писал(а):Можно и удалить строки с повторяющимися полями запросом типа этого:
Код: Выделить всё
DELETE *
FROM Таблица
WHERE Таблица.Код NOT IN (SELECT MIN(Таблица.Код) FROM Таблица GROUP BY Таблица.Данные1, Таблица.Данные2, ...)


Не подскажешь ли, возможно ли такое с использованием рекордсета?
Последний раз редактировалось Summer.05 17.08.2006 (Чт) 21:18, всего редактировалось 1 раз.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.08.2006 (Чт) 21:17

Нет. Никакие выборки и запросы к рекордсету невозможны. Возможно только AddNew и Delete построчно и навешивание фильтра.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 17.08.2006 (Чт) 21:22

Antonariy

Понял, спасибо!
А как же использовать фильтр для поиска двух одинаковых записей в одном поле? Я понимаю, надо будет идти циклом, сравнивая строки для последующего делета одинаковых записей по конкретному полю. ЧТо это за фильтр, как он выглядит?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.08.2006 (Чт) 21:31

rs.filter = "field>1 or field<10"
Аналогично синтаксису where. А чтобы искать повторы, рекордсет сначала нужно отсортировать по нужному полю/полям.
rs.sort="fld1 asc, fld2 desc"
В любом случае, это проще делать запросами в QA.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 17.08.2006 (Чт) 21:42

Antonariy
Да с сортировкой понятно, я ее провожу по полю Title,
Проблема в том, что это поле - текстовое и значительного размера (254). Поэтому установка фильтра для текстовог поля для меня проблематична. Что с чем сравнивать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.08.2006 (Пт) 7:16

Antonariy писал(а):Нет. Никакие выборки и запросы к рекордсету невозможны.

Кстати, немного не так.
Есть тип данных DataType.IDISPATCH (который правда не поддерживается в ADO старше 2.1).
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 8:52

Механизм удаления повторов следует выбирать исходя из того, что представляют из себя данные, насколько похожи повторы. Если они идентичны, то самое простое - удалить запросом. Если +/- трамвайная остановка, то визуально - отсортировав выборку по критерию похожести и ручками удаляя каждую лишнюю запись.

Выложи репрезентативную выборку записей на сто, например в экселе. Тогда будет понятно, что тебе больше подойдет.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 18.08.2006 (Пт) 10:15

Antonariy
Да, спасибо!
Я уже понял, что ручками придется.
Правда, среди 38080 тем диссертаций придется удалить около 10000.

"Если все делать ручками, то они скоро отвалятся", как говорит один из наших гуру... :)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 11:07

Ну теперь хоть понятно с чем имеем дело :)
30% повторов - довольно много. Но 38к - все таки мало :) Большую часть получится удалить запросами, на долю "ручек" останется немного :wink:
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 18.08.2006 (Пт) 19:40

Antonariy
Ты прав, вот я и стараюсь додуматься, как их удалить.
Вариант 1. - через сохранения уже ощищенного текста из рекордсета (твоими молитвами).

Вариант2. - Удаление фильтром.
Но тут затык: ЧТо писать в WHERE?
Нужно сравнивать одинаковые названия диссертаций из поля Title,

Явно, что где-то лишний пробел, где-то не такая буква. На ручки работы хватит, естественно.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList