Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Внизпомогите сделать sql запрос Найти похожие ветки
← →
werr (2002-07-19 11:02) [0]как удалить повторяющиеся записи в бд?
← →
Avsam (2002-07-19 11:06) [1]Очень интересный вопрос.
Я нашел только как их отловить.
А вот как удалить, причем одну из них все-таки оставив.
← →
werr (2002-07-19 11:18) [2]впринципе можно сделать select distinct * и скопироавать во временную бд, очистить исходную и скопировать из временной в неё, но так как-то криво и точно долго.
Так что все-таки как это сделать одним запросом?
← →
sniknik (2002-07-19 11:20) [3]програмка на fox d 15решает эту "проблему"
← →
Johnmen (2002-07-19 11:22) [4]Никак, поскольку нет однозначного критерия различия одинаковых записей !!!
← →
sniknik (2002-07-19 11:26) [5]почему нет. если все поля одинаковы то одну запись надо удалять. или это для select distinct?
← →
werr (2002-07-19 11:29) [6]> sniknik © (19.07.02 11:20)
Эта программка на фоксе называется "d15", я правильно понял? И где ее можно найти?
> Johnmen © (19.07.02 11:22)
не понял мысль, поясните пожалуйста.
← →
Desdechado (2002-07-19 11:31) [7]для абсолютно одинаковых можно через TTable различать их по номерам
← →
sniknik (2002-07-19 11:35) [8]нет я не ее имел ввиду.
можеш код поправить под себя. (для полной проверки надо все поля проверять, мне было достаточно одного)
SET TALK OFF
USE BASE\GOODS.DBF
INDEX ON CODE TAG CODE
GOTO TOP
MDUP=0
DO WHILE .NOT. EOF()
MCODE= CODE
MREC= RECNO()
SKIP
IF MCODE = CODE
GOTO MREC
DELETE NEXT 1
MDUP= MDUP+1
ELSE
SKIP -1
ENDIF
IF .NOT. EOF()
SKIP
ENDIF
ENDDO
? "Удалено дупликатов : ", MDUP
PACK
QUIT
← →
Johnmen (2002-07-19 11:43) [9]Поясняю. Если, например, есть 2 одинаковых записи, то не существует критерия их различности, значит запрос на удаление не в состянии их различить, и соответственно удалить одну из них !
← →
werr (2002-07-19 11:44) [10]> sniknik © (19.07.02 11:35)
Чего-то не хочет ваш запрос работать. Ругается уже на TALK
у меня база -- dBase. Использую Local sql. Может из-за этого?
← →
sniknik (2002-07-19 11:51) [11]Johnmen ©
поэтому и делал перебором :-) (правда после понял прощебыло бы индек на все поля составной наложить и select -ом но было поздно :-)
werr
SET TALK OFF
это запрет вывода на экран выкинь его если не берет. Хотя... Local sql это термин дельфи а програмка то на фоксе (я писал) ты где ее пытаешся выполнить?
← →
werr (2002-07-19 11:56) [12]выполняю через Query в самой дельфи (мне так больше нравится)
← →
sniknik (2002-07-19 12:05) [13]тогда тебе это не пойдет. попробуй составной индекс на все значимые поля и select distinct into (чтото подобное) во временную таблицу. удалить в этой не получится ввиду Johnmen © (19.07.02 11:43)
← →
werr (2002-07-19 12:06) [14]> sniknik ©
все равно не работает, пишет "Token not found. Token USE".
Ну да фиг с ним, раз нет относительно простого решения, то сделаю как описано werr (19.07.02 11:18). Дольше будет себе и всем вам мозги компостировать.
← →
sniknik (2002-07-19 12:08) [15]можно и в дельфи тот код переделать но надо Table использовать.
← →
fnatali (2002-07-19 12:30) [16]Если рассматривать "повторяющиеся записи" как записи, у которых значения в определённых полях одинаковые, то, например, должен работать такой вариант (для одного поля znach)
delete tabl where id in (select t2.id from tabl t1,tabl t2
where (t1.znach=t2.znach) and (t1.id<t2.id))
← →
Дмитрий Баранов (2002-07-19 13:40) [17]От СУБД зависит. В MSSQL все просто.
Пусть у нас есть ряд E-mail, которые повторяются не один раз. Пишется функция, например,
create function COUNT_OF_EMAILS(@email nvarchar(255))
returns int
as
begin
return (select count(*) from _EMAILS where email = @email)
end
подсчитывает количество повторяющихся значений.
Делаем хранимую процедурку и запускаем ее.
create procedure DEL_SEC_MAIL as
begin
declare @id int
declare @email nvarchar(255)
declare temp_cur cursor scroll for
select id, email from _EMAILS
open temp_cur
while @@FETCH_STATUS = 0
begin
fetch next from temp_cur into @id, @email
if (dbo.COUNT_OF_EMAILS(@email) > 1)
begin
delete from _EMAILS where id=@id
end
end
close temp_cur
deallocate temp_cur
end
Не забывайте делать BACKUP :)
← →
Шамиль (2002-07-24 12:49) [18]Я в Fox-e делаю так:
---------------------------------------
blank all fields TEMP
replace all TEMP with .F. for deleted()
recall all
Сохраняем метки удаления в спец. или временное поле
и убираем их
---------------------------------------
index on KOD target KOD_UNQ unique && Индексируем с параметром уникальности по нужному полю
index on KOD target KOD && и без уникальности (т.е. все)
delete all && Помечаем на удаление всех
set order to KOD_UNQ && Ставим уникальный индекс,
&& т.е. сейчас доступны только
&& первые экземпляры каждого
&& ключа
recall all && И восстанавливаем их
set order to KOD && Устанавливаем обычный индекс -
&& имеем полный список с
&& дубликатами, помеченными
&& на удаление
pack && Удаляйте на здоровье! :)
---------------------------------------
delete all for TEMP && Восстанавливаем метки удаления
Понятное дело, что в базах я стараюсь не держать помеченных
на удаление записей (вообще использую эту фичу именно в
пометочных целях).
Проиндексировать таблицу по всем полям - по моему и в Дельфях
не проблема. Проблема в целесообразности этого. По моему опыту -
для полной идентификации записи важны 4 - 5, максимум 10 полей.
Если у тебя Memo с картинками, то и тогда, думаю, можно
найти выход.
← →
MOleg (2002-07-24 14:35) [19]> werr
Извините, а если сохранить только повторяющиеся записи (естественно Distinct).
Потом удалить эти записи из БД и добавить сохраненные записи.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c