Форум: "Базы";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
ВнизКак удалить дубликаты записей в .dbf? Найти похожие ветки
← →
Andrei_ (2002-09-03 23:49) [0]В базе около 80 полей и 80 000 записей.
← →
sniknik (2002-09-04 00:18) [1]самый простой способ
SELECT * INTO [dBase IV;DATABASE=D:\].[TEST1#DBF] FROM (SELECT DISTINCT * FROM [dBase IV;DATABASE=D:\].[TEST#DBF])
проверено работает.
вызов делается из подключения через JET к базе Access. Дубликатом (здесь) считается совпадение по всем полям. Таблици не индексированы. (добавление индекса возможно исказит результат)
← →
sniknik (2002-09-04 00:41) [2]кстати и так работает если тип базы в подключениии указать
SELECT * INTO TEST1 FROM (SELECT DISTINCT * FROM TEST)
подключение
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=dBase IV;Persist Security Info=False
а я то раньше мучился перебором, после начал через связь по выборке с DISTINCT-том удалять, а с Jet-ом все как просто оказалось, только переименовать табличку остается.
← →
Виталий Панасенко (2002-09-04 09:34) [3]Можно и так:
delete from table1 t1
where 1< (select count(*) from table1 t2 where t1.field1=t2.field1 and t1.field2=t2.field2 и так все поля (можно только ключевые - смотря что понимать под дублем))
Обратить внимание если есть NULL-значение - запрос чуть расшириться.
← →
sniknik (2002-09-04 10:31) [4]Виталий Панасенко->
этот запрос удалит ВСЕ повторяющиеся записи, а ведь одну из них надо оставить,
Andrei_->
нет?
← →
Andrei_ (2002-09-04 17:55) [5]C помощью SQL интересно, но есть только Clipper и файл .dbf, в котором некоторые записи повторяются по 5 раз, а надо оставить только одну.
Дублем считаются записи, в которых все значения полей одинаковые.
Первичного ключа нет. Есть пустые значения.
← →
Виталий Панасенко (2002-09-05 09:10) [6]sniknik->
Этот запрос удалит ВСЕ записи, кроме ОДНОЙ - проверено
← →
Виталий Панасенко (2002-09-05 09:16) [7]:-))) Не так выразился: удалит ЛИШНИЕ дубликаты и оставит ОДИН вариант записи - проверено
← →
Anatoly Podgoretsky (2002-09-05 09:29) [8]Работа явно разовая, я бы поступил в данном случае по другому и без SQL
Добавил бы еще одно поле, по нему индекс, в это поле с помощью какой либо хеш функции поместил бы значение.
Дальше при активном индексе с помощью TTable прошелся бы последовательно по всем записям и удалил лишнии, затем упаковка таблицы.
В зависимости от дальнейшего или оставил бы это поле как уникальный индекс или удалил бы, но в любом случае стоит подумать об первичном ключе или его аналоге, на будущее, что бы подобное больше не повторялось
← →
Andrei_ (2002-09-05 10:48) [9]В том-то и дело, Анатолий, что работа не разовая - приходится исправлять чужие ошибки: база ежедневно пополняется пакетами, в которых куча повторов. Вмешаться в процесс пополнения мы не можем - только после него можно делать с базой все что угодно. Вручную эту работу выполнять нереально. Да еще ОС - DOS 6.22
← →
Anatoly Podgoretsky (2002-09-05 10:54) [10]Тогда тоже самое, только на постоянной основе, или в строить в своб программу или отдельной утилитой, главное в этом деле не использовать SQL просто проще другими средствами, под которые заточен Парадоксовский формат - BDE и TTable, чисто навигационные методы, если пойдешь на дополнительное поле, то достаточно делать корректировку для тех записей где оно пустое, но в любом случае это тоже разовая работа, сделал один раз в начале сеанса, далее не требуется
← →
NickBat (2002-09-05 12:08) [11]Согласен с Podgoretsky.
В том же Fox можно написать:
select dist * from TABLE into table NEWTABLE
а затем просто переименовать NEWTABLE->TABLE
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c