Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
7-85731
иван
2002-07-16 15:49
2002.09.26
TCanvas


7-85721
vasya_dvc
2002-07-16 12:15
2002.09.26
Запуск приложения через асм.


4-85774
vi0
2002-08-13 12:37
2002.09.26
как определить цвет пикселя в окне другой программы ?


1-85600
Fog
2002-09-14 13:40
2002.09.26
Key


1-85439
lovres
2002-09-14 15:37
2002.09.26
Как значение типа DateTime уменьшить на 1 секунду?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский