Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.04.2009, 22:18
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
Печаль Удаление дубликатов в ADO, Что сделать чтобы в базе данных...

Всем доброго времени суток.
Вот какая проблема:

Работаю в delphi 7
данные хранятся в файле .mdb, через ADOgrid, ADOTable и остальные компоненты ADO.

в таблице rss есть поле link
мне нужно чтобы по этому полю искались дубликаты, проще говоря чтобы в этой таблице не было повторяющихся записей, а проверять это получится только по полю link, потому что ссылка уникальна, а остальные поля, такие как Тема - не уникальны

Не могу понять как это сделать

помогите... толи свойство для таблицы задать нужно, толи запрос какой написать... не понимаю я... в программе просто этот кусок кода не мой, я ни с Адо, ни с запросами не знаком...
Ответить с цитированием
  #2  
Старый 04.04.2009, 23:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Отобрать все дубликаты в таблице rss можно так:
Код:
select Link from rss group by link having Count(Link)>1
А вот для правильного удаления дубликатов, надо отталкиваться от уникального ключа в rss. Если таковым является id, то запрос на удаление повторов будет таким:
Код:
delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 05.04.2009, 00:05
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
По умолчанию

Огромное мерси, сейчас попробую что нить сотворить с этим
__________________
www.forumforall.net - Мы создаем общение!
Ответить с цитированием
  #4  
Старый 05.04.2009, 00:11
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
По умолчанию

блин, не получается....
Как написать нужно?
ADOTable1.SQL := select Link from rss group by link having Count(Link)>1
или как?
__________________
www.forumforall.net - Мы создаем общение!
Ответить с цитированием
  #5  
Старый 05.04.2009, 00:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну вы хоть с синтаксисом немножко ознакомьтесь.
Код:
ADOTable1.SQL.text := 'select Link from rss group by link having Count(Link)>1';
ADOTable1.Open;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 05.04.2009, 00:50
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
По умолчанию

неа, в обоих примерах выдает ошибку
[Error] Unit1.pas(362): Incompatible types: 'TStrings' and 'String'

Пишу так:
Код:
ADOQuery1.SQL := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)';
   ADOTable1.Open;
__________________
www.forumforall.net - Мы создаем общение!
Ответить с цитированием
  #7  
Старый 05.04.2009, 12:30
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от BetaCoder
Всем доброго времени суток.
в таблице rss есть поле link
мне нужно чтобы по этому полю искались дубликаты, проще говоря чтобы в этой таблице не было повторяющихся записей, а проверять это получится только по полю link, потому что ссылка уникальна, а остальные поля, такие как Тема - не уникальны
Вот что вы попросили. Найти дубликаты. Я вам и дал код для поиска дубликатов:
Код:
ADOQuery.SQL.Text := 'select Link from rss group by link having Count(Link)>1';
ADOQuery.Open;
В итоге вы получите в ADOQuery набор данных с которыми что-то надо делать, как минимум имеет смысл посмотреть их.

Что-бы удалить уже имеющиеся дубликаты я вам дал второй код:
Код:
ADOQuery.SQL.Text := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)';
ADOQuery.ExecSQL;
НО для выполнения второго запроса надо уже использовать метод ADOQuery.ExecSQL т.к. запросы на удаление,вставку,изменение данных невозвращает никакого набора данных.

Теперь вы уже хотите проверять данные перед вставкой на дубликаты, а это уже третий запрос. Третьего запроса можно избежать, если вы на таблицу rss построите уникальный индекс по полю Link, но создать уникальный индекс на данные содержащие повторяющиеся значения невозможно, поэтому прежде чем его создать пропустите свои данные через запрос на удаление, о котором я писал чуть выше. Об этом я писал вам в теме из раздела БД.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 05.04.2009 в 12:42.
Ответить с цитированием
  #8  
Старый 05.04.2009, 15:22
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
По умолчанию

Ну не знаю я как это делается...

как вот:
допустим что база пустая.
если поле link уникальное, то в базу не будут добавляться те-же ссылки.
так?
если так, то как сделать поле линк уникальным? я в свойствах не наше такого параметра ((
__________________
www.forumforall.net - Мы создаем общение!
Ответить с цитированием
  #9  
Старый 05.04.2009, 16:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вы работаете с Акцесовской базой. Запустите Акцесс, откройте вашу БД, выберите конструктор для таблицы rss, выберите комманду Индексы. Создайте новый индекс для поля Link и задайте ему свойство Уникальный.
Теперь сам Акцесс будет следить за тем, что-бы в поле Link непопадали повторяющиеся значения, и при попытке внести такое значение он будет генерить ошибку. Сохраните структуру таблицы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 05.04.2009, 16:21
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
По умолчанию

я понимаю, что это акцессовская база... но сам акцесс за ней следить не будет потому что у меня вообще офиса нет никакого, а БД создана средствами дельфи...

Хотя идею понял, сейчас офис установлю, может что получится...
__________________
www.forumforall.net - Мы создаем общение!
Ответить с цитированием
  #11  
Старый 05.04.2009, 16:53
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Следить будет Jet через который вы к БД обращаетесь, Акцесс делает так-же.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 05.04.2009, 20:39
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Страдалецъ
Код:
ADOQuery.SQL.Text := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)';
ADOQuery.ExecSQL;
Долго работаю с СКЛ, помоему правильно писать
Код:
delete from rss where id in (select Max(id) from rss group by Link having Count(Link)>1)
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #13  
Старый 05.04.2009, 20:59
BetaCoder BetaCoder вне форума
Прохожий
 
Регистрация: 03.03.2009
Сообщения: 16
Репутация: 10
По умолчанию

спасибо, попробую
__________________
www.forumforall.net - Мы создаем общение!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025