Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужен запрос на удаление дубликатов  [new]
Sergey A.
Member

Откуда:
Сообщений: 55
Помогите с запросом на удаление дублирующихся записей.

Есть таблица
MyTable

В ней поля ID, Email

Задача - если есть несколько записей с одинаковым значением поля Email
необходимо оставить только одну запись, остальные удалить.
Более желательный результат:
... необходимо оставить запись с самым большим значением ID, остальные удалить.


--
С уважением,
Сергей
14 авг 09, 11:00    [7537728]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Так удаляйте записи, ID которых не равно максимальному ID по этому же Email

Что конкретно у Вас не получается?
14 авг 09, 11:04    [7537756]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
так наверна
Guest
DELETE 
FROM Tab
WHERE ID NOT IN (SELECT MAX(ID) FROM Tab GROUP BY Email)
14 авг 09, 11:12    [7537828]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
aklerk
Member

Откуда:
Сообщений: 66
Это работает быстрее:

DELETE 
	a
FROM
	[dbo].[MyTable] a, [dbo].[MyTable] b
WHERE
	a.[Email] = b.[Email] AND a.[ID] < b.[ID]
14 авг 09, 11:31    [7538012]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SQL2005/SQL2008
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID) FROM MyTable)
DELETE CTE WHERE N>1;
14 авг 09, 12:30    [7538609]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
pacha
Member

Откуда:
Сообщений: 239
iap
SQL2005/SQL2008
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID) FROM MyTable)
DELETE CTE WHERE N>1;

так это.. получится результат обратный искомому автором:)
автор
... необходимо оставить запись с самым большим значением ID, остальные удалить.
14 авг 09, 12:34    [7538638]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
pacha
iap
SQL2005/SQL2008
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID DESC) FROM MyTable)
DELETE CTE WHERE N>1;

так это.. получится результат обратный искомому автором:)
автор
... необходимо оставить запись с самым большим значением ID, остальные удалить.

Я надеюсь, Sergey A. не механически копирует то, что ему предлагают...
14 авг 09, 12:40    [7538695]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
Sergey A.
Member

Откуда:
Сообщений: 55
Спасибо за примеры.

До такого:
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID) FROM MyTable)
DELETE CTE WHERE N>1;

я бы точно ни когда не додумался..

--
С уважением,
Сергей
14 авг 09, 13:42    [7539239]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Sergey A.
До такого:
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID) FROM MyTable)
DELETE CTE WHERE N>1;

я бы точно ни когда не додумался..
а можно ещё и так:
SQL2005/SQL2008
DELETE CTE
FROM (SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID DESC) FROM MyTable) CTE(N)
WHERE N>1;
14 авг 09, 20:42    [7541687]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
sergei2009
Member

Откуда:
Сообщений: 47
А если нужно проверять не только по одному параметру, а так чтобы он автоматически удалял более старые повторы используя несколько столбцов например tel, vid, cena, kol
19 авг 09, 17:37    [7558082]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
Glory
Member

Откуда:
Сообщений: 104760
sergei2009
А если нужно проверять не только по одному параметру, а так чтобы он автоматически удалял более старые повторы используя несколько столбцов например tel, vid, cena, kol

Придется указывать эти столбцы в запросе
19 авг 09, 17:39    [7558097]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
sergei2009
А если нужно проверять не только по одному параметру, а так чтобы он автоматически удалял более старые повторы используя несколько столбцов например tel, vid, cena, kol
"используя" - это как?
Всё-таки, корректно заданный вопрос быстрее приведёт к полезному ответу.
И о версии сервера не забывайте.
19 авг 09, 17:43    [7558128]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
sergei2009
Member

Откуда:
Сообщений: 47
вообщем говоря иногда пользователи добавляют, а не обновляют объявления, поэтому хотелось бы, чтобы данный запрос удалял более старые записи
19 авг 09, 17:59    [7558250]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
Glory
Member

Откуда:
Сообщений: 104760
sergei2009
вообщем говоря иногда пользователи добавляют, а не обновляют объявления, поэтому хотелось бы, чтобы данный запрос удалял более старые записи

И в чем у вас конкретная проблема ?
19 авг 09, 18:00    [7558263]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
sergei2009
вообщем говоря иногда пользователи добавляют, а не обновляют объявления, поэтому хотелось бы, чтобы данный запрос удалял более старые записи
Рекомендации, пункты 6 и 4
19 авг 09, 18:02    [7558276]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
sergei2009
Member

Откуда:
Сообщений: 47
Паганель,
DELETE CTE
FROM (SELECT ROW_NUMBER()OVER(PARTITION BY Email ORDER BY ID DESC) FROM MyTable) CTE(N)
WHERE N>1;

вот запрос проверяющий по одному критерию email, а мне нужно по трём столбцам например st1, st2,st3

база mysql, PHP
20 авг 09, 17:23    [7563262]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
sergei2009
база mysql


Вот и вопрос следует задать на соотвествующем форуме.
20 авг 09, 17:24    [7563268]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
sergei2009
Member

Откуда:
Сообщений: 47
Здесь эта тема обсуждалась, может кто знает как подкоректировать под определение по нескольким столбцам?
21 авг 09, 09:06    [7564743]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
xSQL
Guest
sergei2009,

Я что то не припоминаю о существовании CTE в MySQL
21 авг 09, 09:44    [7564875]     Ответить | Цитировать Сообщить модератору
 Re: Нужен запрос на удаление дубликатов  [new]
Glory
Member

Откуда:
Сообщений: 104760
sergei2009
Здесь эта тема обсуждалась, может кто знает как подкоректировать под определение по нескольким столбцам?

Не пробовали через запятую перечислить нужные столбцы ?
21 авг 09, 10:58    [7565320]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить