Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Возможно, это задача типичная для приложений баз данных.

Дано:
В таблице Table1 есть 4 поля (наряду с прочими): Phone1, Model, [Year], PubDate.

Надо:
Удалить все записи с одинаковыми значениями первых трех полей, но чтобы запись с самым последним PubDate осталась.
Если все PubDate одинаковы, то без разницы, какие удалять, но одна запись, чтобы осталась по любому.

Вопрос: можно ли это реализовать как-нибудь одним (двумя) запросами.
Или все же писать алгоритм (на VB), создавать рекодсет, прокручивать, удаляя? И как в этом случае правильно построить алгоритм?

Может кто-то уже работал над подобной задачей?

Заранее спасибо.
Иван Абрамов.
31 май 04, 11:58    [710694]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
О недавно подсмотрел

delete t1.*
from tbl t1 inner join tbl t2
on (t1.phone = t2.phone) and (t1.model = t2.model)
and (t1.year = t2.year) and (t1.PubDate < t2.PubDate)
?
31 май 04, 12:09    [710731]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
Blunder
Guest
http://www.ibase.ru/devinfo/deldupes.htm

здесь несколько вариантов описано
31 май 04, 12:16    [710749]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Спасибо, paparome,

но я вижу, что твой запрос удалит только те, где t1.PubDate < t2.PubDate.
А как быть в случае, когда и PubDate одинаковые, и надо оставить одну (любую) запись?

Blunder, тоже спасибо.
31 май 04, 12:39    [710807]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Подкорректировал немного запрос

delete t1.*
from tblAd t1
inner join tblAd t2 on t1.phone1 = t2.phone1
and t1.model = t2.model
and t1.year = t2.year
and (t1.PubDate < t2.PubDate or (t1.PubDate = t2.PubDate and t1.ID < t2.ID))

Так наверно будет то, что надо.
31 май 04, 12:50    [710834]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
Galustov
Member

Откуда:
Сообщений: 369
Хороший вариант у Ивана Обрамова, только объясните ID - это что?
31 май 04, 12:59    [710864]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимально написать запрос (построить алгоритм) на удаление дублей?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
ID - это уникальное поле, присутствующее в таблице. (В условии задачи отсутствовало.)
31 май 04, 13:06    [710884]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить