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

Откуда:
Сообщений: 13
Добрый день, есть у меня таблица с многими номерами телефонов. Около 200 тысяч. Там номера часто повторяются. Но загвоздка в том что мне надо удалить не просто дубликаты, но и исходное значение.
Например дано:
1
2
3
4
1
1
3
Результат:
2
4
Важно чтоб номера которые повторялись - удалялись тоже...Заранее огромное спасибо.
14 янв 13, 15:07    [13767276]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
FR33D,

удалить-то надо откуда? Из таблицы или из результата запроса?
14 янв 13, 15:12    [13767325]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
...
having count(*)=1
14 янв 13, 15:15    [13767346]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
FR33D
Member

Откуда:
Сообщений: 13
Удалить с простой таблицы MS SQL.
having count(*)=1 - Пробовал...Select получается, а удалить эти строки не выходит. Вот:

SELECT [Phone]
FROM [AutoLabDecor].[dbo].[RiaUrlParsing]
GROUP BY [Phone]
HAVING count(*) > 1
14 янв 13, 15:19    [13767374]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Konst_One
...
having count(*)=1
Сейчас скажет: "У меня тыща колонок. Хочу их все видеть.
А противный сервер пишет про какую-то GROUP BY"
14 янв 13, 15:19    [13767377]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
FR33D
Member

Откуда:
Сообщений: 13
iap
Konst_One
...
having count(*)=1
Сейчас скажет: "У меня тыща колонок. Хочу их все видеть.
А противный сервер пишет про какую-то GROUP BY"


Нет уж, уважаемый) Я не совсем криворукий) Просто в данном случае у меня возникла проблема....
14 янв 13, 15:22    [13767391]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
FR33D
Удалить с простой таблицы MS SQL.
having count(*)=1 - Пробовал...Select получается, а удалить эти строки не выходит. Вот:

SELECT [Phone]
FROM [AutoLabDecor].[dbo].[RiaUrlParsing]
GROUP BY [Phone]
HAVING count(*) > 1
PK есть? Как строки отличать друг от друга?
Надо, всё-таки, удалить из таблицы?
DELETE R
FROM [AutoLabDecor].[dbo].[RiaUrlParsing] R
WHERE (SELECT COUNT(*) FROM [AutoLabDecor].[dbo].[RiaUrlParsing] RR WHERE RR.[Phone]=R.[Phone])>1;
14 янв 13, 15:23    [13767404]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
FR33D, ну так вы уже всё сделали, можете написать даже так:
delete * from Ytable where id in
( SELECT ... )
14 янв 13, 15:23    [13767409]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
FR33D
Member

Откуда:
Сообщений: 13
iap
FR33D
Удалить с простой таблицы MS SQL.
having count(*)=1 - Пробовал...Select получается, а удалить эти строки не выходит. Вот:

SELECT [Phone]
FROM [AutoLabDecor].[dbo].[RiaUrlParsing]
GROUP BY [Phone]
HAVING count(*) > 1
PK есть? Как строки отличать друг от друга?
Надо, всё-таки, удалить из таблицы?
DELETE R
FROM [AutoLabDecor].[dbo].[RiaUrlParsing] R
WHERE (SELECT COUNT(*) FROM [AutoLabDecor].[dbo].[RiaUrlParsing] RR WHERE RR.[Phone]=R.[Phone])>1;


Примари кей на строке с ID. Но это вообще не важно в нашей ситуации...строки формата 0932648124 все...
Сейчас попробую ваш способ. Спасибо
14 янв 13, 15:25    [13767422]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
FR33D
Member

Откуда:
Сообщений: 13
iap,

Ваше решение очень помогло... Все заработало. Огромнейшее спасибо. И всем остальным кто старался помочь. Всем добра и хорошего окончания рабочего дня)
14 янв 13, 15:27    [13767433]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
FR33D
iap
пропущено...
PK есть? Как строки отличать друг от друга?
Надо, всё-таки, удалить из таблицы?
DELETE R
FROM [AutoLabDecor].[dbo].[RiaUrlParsing] R
WHERE (SELECT COUNT(*) FROM [AutoLabDecor].[dbo].[RiaUrlParsing] RR WHERE RR.[Phone]=R.[Phone])>1;


Примари кей на строке с ID. Но это вообще не важно в нашей ситуации...строки формата 0932648124 все...
Сейчас попробую ваш способ. Спасибо
Почему неважно? Есть и другие варианты
DELETE R
FROM [AutoLabDecor].[dbo].[RiaUrlParsing] R
WHERE EXISTS(SELECT * FROM [AutoLabDecor].[dbo].[RiaUrlParsing] RR WHERE RR.ID<>R.ID AND RR.[Phone]=R.[Phone]);
Должен быть побыстрее COUNT(*), по-видимому.
От индексов, конечно, зависит
14 янв 13, 15:32    [13767478]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
FR33D,

может так?

declare @tbl table (i int);
insert @tbl values (1),(2),(3),(4),(1),(1),(3);

with cte as
(
select *, count(*) over (partition by i) q
from @tbl
)
delete from cte where q>1

select * from @tbl
14 янв 13, 15:53    [13767680]     Ответить | Цитировать Сообщить модератору
 Re: Удалить повторяющиеся значения  [new]
sergei.mironenko
Member

Откуда:
Сообщений: 11
Вот вариант, должен тоже быть подходящим по плану (с учетом существования индекса по полю).
create table #table (id int)

insert into #table
select 1
union all select 2
union all select 3
union all select 4
union all select 1
union all select 1
union all select 3

-- Нужен индекс по полю
create nonclustered index ix_id on #table(id)

delete t1
from 
	#table t1 with(nolock) 
	INNER JOIN (
		select id, count(*) as cnt
		from #table with(nolock) 
		group by id
	) as t2 on t1.id = t2.id
where t2.cnt > 1
	
select * from #table with(nolock)
drop table #table
14 янв 13, 18:36    [13768762]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить