Как оптимально написать запрос (построить алгоритм) на удаление дублей?
Иван Абрамов
Дата: 31.05.2004 11:58:20
Возможно, это задача типичная для приложений баз данных.
Дано:
В таблице Table1 есть 4 поля (наряду с прочими): Phone1, Model, [Year], PubDate.
Надо:
Удалить все записи с одинаковыми значениями первых трех полей, но чтобы запись с самым последним PubDate осталась.
Если все PubDate одинаковы, то без разницы, какие удалять, но одна запись, чтобы осталась по любому.
Вопрос: можно ли это реализовать как-нибудь одним (двумя) запросами.
Или все же писать алгоритм (на VB), создавать рекодсет, прокручивать, удаляя? И как в этом случае правильно построить алгоритм?
Может кто-то уже работал над подобной задачей?
Заранее спасибо.
Иван Абрамов.
paparome
Дата: 31.05.2004 12:09:06
О недавно подсмотрел
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) |
|
?
Blunder
Дата: 31.05.2004 12:16:30
http://www.ibase.ru/devinfo/deldupes.htm
здесь несколько вариантов описано
Иван Абрамов
Дата: 31.05.2004 12:39:54
Спасибо, paparome,
но я вижу, что твой запрос удалит только те, где t1.PubDate < t2.PubDate.
А как быть в случае, когда и PubDate одинаковые, и надо оставить одну (любую) запись?
Blunder, тоже спасибо.
Иван Абрамов
Дата: 31.05.2004 12:50:39
Подкорректировал немного запрос
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))
Так наверно будет то, что надо.
Galustov
Дата: 31.05.2004 12:59:37
Хороший вариант у Ивана Обрамова, только объясните ID - это что?
Иван Абрамов
Дата: 31.05.2004 13:06:14
ID - это уникальное поле, присутствующее в таблице. (В условии задачи отсутствовало.)