Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как найти дублирующиеся значения полей в таблице [D6]


kyn66 ©   (2005-01-22 16:59:00) 

В огромной базе есть дубли по полю. Как их выбрать из базы, именно только дубли?


Danilka   (2005-01-23 21:40:00) [1]

[7] palva ©   (22.01.05 22:41)
Дл [4], конечно [6] - стандартное решение. Но когда нужны все поля, или любое кол-во полей, кроме поля с дублями, вариант который я привел в [1] будет самым быстрым, при условии что есть индекс по полям duble_field и id. Что, вобщем-то вполне логично, если подумать.


SergP   (2005-01-23 20:36:00) [2]


>  [11] kyn66 ©   (23.01.05 14:31)
> Я же говорил, что перебирая записи исходной даблицы при
> помощи SELECT отбираю дубликаты.... Но ведь дубликат, если
> он есть, то имеет несколько одинаковых значений, а по сему
> SELECT отрабатывает на оди и тот-же дубль дважды. Я думаю
> как-то нужно делать селект в селекте или применять промежуточные
> базы, чего не хотелось-бы делать. Неужели нет какого-то
> стандартного решения в SQL-е?


Ну ведь уже было сказано в:


>  [6] Anatoly Podgoretsky ©   (22.01.05 19:08)
> Стандартный путь использовать групировки с Count и Having
> > 1


т.е., например:

Получить значения дублирующихся полей:
select field from table group by field having count(*)>1

Получить дублирующиеся записи:
select * from table where field in (select field from table group by field having count(*)>1)

Можно попробовать так: чтобы получить по одной из каждой группы дублирующихся записей, но такое может не везде работать:
select * from table group by field having count(*)>1


kyn66   (2005-01-23 14:31:00) [3]

Я же говорил, что перебирая записи исходной даблицы при помощи SELECT отбираю дубликаты.... Но ведь дубликат, если он есть, то имеет несколько одинаковых значений, а по сему SELECT отрабатывает на оди и тот-же дубль дважды. Я думаю как-то нужно делать селект в селекте или применять промежуточные базы, чего не хотелось-бы делать. Неужели нет какого-то стандартного решения в SQL-е?


palva   (2005-01-23 12:50:00) [4]

kyn66 ©   (23.01.05 12:25) [9]
Ну а дубликаты-то хоть рядом лежат? Сортировка срабатывает? Если да, то сделайте с записями то что вам нужно. Например, удалите устаревшие или ошибочные записи, либо сформируйте на их основе новую запись по известному вам алгоритму. Если то, что вы написали в [4], то занесите значение повторяющего поля в список.


kyn66   (2005-01-23 12:25:00) [5]

БД - DbaseIII пробывал прогонять исходную базу и с помощью Query отбирать дубликаты, но они(найденные дубликаты) дублируются, т.к. в отбор попадает как первый элемент дубликата, так и потом второй 8-(


Johnmen   (2005-01-23 00:24:00) [6]

О чем вы, господа ?!!!!
Автор даже не привел тип БД ! О чем может быть разговор ?!


palva   (2005-01-22 22:41:00) [7]

Sergey_Masloff   (22.01.05 18:52) [5]
> Кстати могу поспорить что на 2-3 тысячах записей вы просматривая глазами дубль не найдете.

И спорить не буду, и просматривать не возьмусь. Просматривать - это программно, конечно. Просматривая рекордсет можно делать нужную обработку, удалять, например, или еще что...

Но если задачу конкретизировали ([4]), то [6] - самое оно.


Anatoly Podgoretsky   (2005-01-22 19:08:00) [8]

Стандартный путь использовать групировки с Count и Having > 1


Sergey_Masloff   (2005-01-22 18:52:00) [9]

palva ©   (22.01.05 17:52) [3]
Ага а просматривать табличку миллионов на семь очень быстро. Кстати могу поспорить что на 2-3 тысячах записей вы просматривая глазами дубль не найдете. По крайней мере с первых нескольких раз. А в 20-30 тысячах, скорее всего, не найдете никогда.


kyn66   (2005-01-22 18:36:00) [10]

необходим список значений определеного поля, которые встречаются более одного раза


palva   (2005-01-22 17:52:00) [11]

[1] - очень медленно. Стандартный способ это получить записи с сортировкой по этому полю, последовательно их просматривать и отбирать нужное в другую таблицу. Если по полю нет индекса, то предварительно его построить.


Danilka   (2005-01-22 17:15:00) [12]

а вообще, неплохо-бы уточнить вопрос: необходимо выбрать все записи, у которых определеное поле имеют повторяющиеся значения, или необходим список значений определеного поля, которые встречаются более одного раза?
в [1] я привел первый вариант.


Danilka   (2005-01-22 17:11:00) [13]

Вообще-то, вопрос лучше в базы перенести.
Какая СУБД?
Один из возможных вариантов:
SELECT * FROM my_table m
WHERE EXISTS (SELECT 1 FROM my_table t WHERE t.duble_field = m.duble_field AND t.id != m.id)
где duble_field - дублирующее поле, id - первичный ключ.


Наверх

Титульная страница Поиск, карта сайта Написать письмо