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

Откуда:
Сообщений: 969
таблица
codeid
'111'1
'111'1
'111'2

Необходимо в итоге оставить только один вариант для code:
codeid
'111'2

или
codeid
'111'1

не суть важно. Не могу сообразить запрос.

Для тестов:
create table ##t (code varchar(10), id int)
insert into ##t values('111',1)
insert into ##t values('111',1)
insert into ##t values('111',2)
select * from ##t
drop table ##t
13 ноя 12, 14:58    [13465458]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
Crimean
Member

Откуда:
Сообщений: 13148
если ключей вообще нет, возможно поможет курсор с сортировкой + DELETE WHERE CURRENT OF...
но я бы ключик суррогатный (хотя бы временно) сделал. имхо быстрее / проще выйдет в итоге
13 ноя 12, 15:00    [13465474]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Crimean
если ключей вообще нет, возможно поможет курсор с сортировкой + DELETE WHERE CURRENT OF...
но я бы ключик суррогатный (хотя бы временно) сделал. имхо быстрее / проще выйдет в итоге


Курсор конечно крайний метод )))

А с суррогатным какой запрос получится? Ну предположим добавим key.
13 ноя 12, 15:07    [13465549]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
user89
Member

Откуда:
Сообщений: 2083
_Промешан_,


select code, min(id) [id]
from ##t
group by code
13 ноя 12, 15:13    [13465622]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
user89
Member

Откуда:
Сообщений: 2083
_Промешан_,

вариант с удалением:
;with tmp as (
  select code, id, row_number() over(order by (select 1)) [rn]
  from ##t
)
delete from tmp where rn > 1
13 ноя 12, 15:16    [13465652]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
user89
Member

Откуда:
Сообщений: 2083
так лучше

;with tmp as (
  select code, id, row_number() over(partition by code order by code) [rn]
  from ##t
)
delete from tmp where rn > 1
13 ноя 12, 15:17    [13465670]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
user89
_Промешан_,

вариант с удалением:
;with tmp as (
  select code, id, row_number() over(order by (select 1)) [rn]
  from ##t
)
delete from tmp where rn > 1
Ага:

(3 row(s) affected)
))))))

есть вариант с Delete top (1)... только не доконца вариант. :)
13 ноя 12, 15:18    [13465687]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
С delete top (1) без курсора можно как то?
13 ноя 12, 15:20    [13465713]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
user89
Member

Откуда:
Сообщений: 2083
_Промешан_,

а мой 2-й вариант 13465670 тоже не подходит?
13 ноя 12, 15:23    [13465734]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Ну как вариант...

create table ##t (code varchar(10), id int)
insert into ##t values('111',1)
insert into ##t values('111',1)
insert into ##t values('111',2)

select * from ##t

DECLARE @TableVar TABLE
(code varchar(10), id int)

--
delete from ##t
OUTPUT DELETED.* INTO @TableVar

insert into ##t(code,id)
select code,max(id)
from @TableVar
group by code
 

select * from ##t

drop table ##t
13 ноя 12, 15:31    [13465835]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Непонятно, при чём тут "(3 row(s) affected)"
Вот это же работает?
create table #t (code varchar(10), id int)
truncate table #t;
insert into #t values('111',1)
insert into #t values('111',1)
insert into #t values('111',2)
select * from #t;

WITH CTE(N)AS(SELECT ROW_NUMBER()OVER(PARTITION BY code ORDER BY(SELECT 0))FROM #t)
DELETE CTE WHERE N>1;


select * from #t
drop table #t
И у user89 всё работает.
Не вижу, где проблемы
13 ноя 12, 15:34    [13465868]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
PARTITION BY
Guest
iap
Непонятно, при чём тут "(3 row(s) affected)"
Вот это же работает?
create table #t (code varchar(10), id int)
truncate table #t;
insert into #t values('111',1)
insert into #t values('111',1)
insert into #t values('111',2)
select * from #t;

WITH CTE(N)AS(SELECT ROW_NUMBER()OVER(PARTITION BY code ORDER BY(SELECT 0))FROM #t)
DELETE CTE WHERE N>1;


select * from #t
drop table #t
И у user89 всё работает.
Не вижу, где проблемы

в начальном варианте юзера не было PARTITION BY
13 ноя 12, 15:39    [13465918]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
user89
Member

Откуда:
Сообщений: 2083
PARTITION BY,

я потом сразу привел более корректный вариант
13 ноя 12, 15:42    [13465943]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
PARTITION BY
Guest
user89
PARTITION BY,

я потом сразу привел более корректный вариант

я ж поэтому и написал, в начальном
13 ноя 12, 15:45    [13465977]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
user89
Member

Откуда:
Сообщений: 2083
PARTITION BY,

ок.

З.Ы. Наверное у ТС структура данных отличается от того, что он привел...
13 ноя 12, 15:50    [13466048]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
delete top ( select count(*) - 1 from ##t  ) from ##t
13 ноя 12, 15:51    [13466070]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Knyazev Alexey
delete top ( select count(*) - 1 from ##t  ) from ##t

Да вот как раз об этом я догадался, перед тем как прочитать )))) В точку )

2_user: я успел увидеть только первый вариант. Пока писал ответ не видел второй. )
13 ноя 12, 17:04    [13466813]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
user89
PARTITION BY,

ок.

З.Ы. Наверное у ТС структура данных отличается от того, что он привел...
В данном случае нет. имеено такая таблица.
13 ноя 12, 17:10    [13466854]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
alexey17000
Member

Откуда:
Сообщений: 62
begin tran

select distinct * into #t2 from #t
sp_rename '#t' , '#t3'
sp_rename '#t2' , '#t'
drop table #t3

commit tran


--как то так, наверно
13 ноя 12, 17:15    [13466887]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторений в таблице. Без ключа.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Всем спасибо, воспользовался примером с CTE
13 ноя 12, 19:57    [13467797]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить