Текущий архив: 2005.02.06;
Скачать: CL | DM;
Вниз
как найти дублирующиеся значения полей в таблице Найти похожие ветки
← →
kyn66 © (2005-01-22 16:59) [0]В огромной базе есть дубли по полю. Как их выбрать из базы, именно только дубли?
← →
Danilka © (2005-01-22 17:11) [1]Вообще-то, вопрос лучше в базы перенести.
Какая СУБД?
Один из возможных вариантов:
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 - первичный ключ.
← →
Danilka © (2005-01-22 17:15) [2]а вообще, неплохо-бы уточнить вопрос: необходимо выбрать все записи, у которых определеное поле имеют повторяющиеся значения, или необходим список значений определеного поля, которые встречаются более одного раза?
в [1] я привел первый вариант.
← →
palva © (2005-01-22 17:52) [3][1] - очень медленно. Стандартный способ это получить записи с сортировкой по этому полю, последовательно их просматривать и отбирать нужное в другую таблицу. Если по полю нет индекса, то предварительно его построить.
← →
kyn66 © (2005-01-22 18:36) [4]необходим список значений определеного поля, которые встречаются более одного раза
← →
Sergey_Masloff (2005-01-22 18:52) [5]palva © (22.01.05 17:52) [3]
Ага а просматривать табличку миллионов на семь очень быстро. Кстати могу поспорить что на 2-3 тысячах записей вы просматривая глазами дубль не найдете. По крайней мере с первых нескольких раз. А в 20-30 тысячах, скорее всего, не найдете никогда.
← →
Anatoly Podgoretsky © (2005-01-22 19:08) [6]Стандартный путь использовать групировки с Count и Having > 1
← →
palva © (2005-01-22 22:41) [7]Sergey_Masloff (22.01.05 18:52) [5]
> Кстати могу поспорить что на 2-3 тысячах записей вы просматривая глазами дубль не найдете.
И спорить не буду, и просматривать не возьмусь. Просматривать - это программно, конечно. Просматривая рекордсет можно делать нужную обработку, удалять, например, или еще что...
Но если задачу конкретизировали ([4]), то [6] - самое оно.
← →
Johnmen © (2005-01-23 00:24) [8]О чем вы, господа ?!!!!
Автор даже не привел тип БД ! О чем может быть разговор ?!
← →
kyn66 © (2005-01-23 12:25) [9]БД - DbaseIII пробывал прогонять исходную базу и с помощью Query отбирать дубликаты, но они(найденные дубликаты) дублируются, т.к. в отбор попадает как первый элемент дубликата, так и потом второй 8-(
← →
palva © (2005-01-23 12:50) [10]kyn66 © (23.01.05 12:25) [9]
Ну а дубликаты-то хоть рядом лежат? Сортировка срабатывает? Если да, то сделайте с записями то что вам нужно. Например, удалите устаревшие или ошибочные записи, либо сформируйте на их основе новую запись по известному вам алгоритму. Если то, что вы написали в [4], то занесите значение повторяющего поля в список.
← →
kyn66 © (2005-01-23 14:31) [11]Я же говорил, что перебирая записи исходной даблицы при помощи SELECT отбираю дубликаты.... Но ведь дубликат, если он есть, то имеет несколько одинаковых значений, а по сему SELECT отрабатывает на оди и тот-же дубль дважды. Я думаю как-то нужно делать селект в селекте или применять промежуточные базы, чего не хотелось-бы делать. Неужели нет какого-то стандартного решения в SQL-е?
← →
SergP © (2005-01-23 20:36) [12]
> [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
← →
Danilka © (2005-01-23 21:40) [13][7] palva © (22.01.05 22:41)
Дл [4], конечно [6] - стандартное решение. Но когда нужны все поля, или любое кол-во полей, кроме поля с дублями, вариант который я привел в [1] будет самым быстрым, при условии что есть индекс по полям duble_field и id. Что, вобщем-то вполне логично, если подумать.
Страницы: 1 вся ветка
Текущий архив: 2005.02.06;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.031 c