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

Откуда:
Сообщений: 257
Добрый день.

Подскажите, пожалуйста, можно ли обойтись без курсора


Есть таблица

Название id
Москва. 1
Москва. 2
Москва. 3
Казань. 4
Ярославль 5

Мне надо удалить повторяю змея записи, но одну из повторчющихся оставить


Написал курсор с временной таблицей, работает, но уверен есть способ написать без него, но ничего не приходит на ум

Заранее спасибо
4 апр 13, 16:43    [14136792]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
Гость333
Member

Откуда:
Сообщений: 3683
DELETE FROM Таблица
WHERE id NOT IN (SELECT MIN(id) FROM Таблица GROUP BY Название)
4 апр 13, 16:46    [14136817]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
;with cte as (
   select n =row_number() over(order by Название)
   from table
)
delete from cte where n>1
4 апр 13, 16:48    [14136829]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
;with cte as (
select row_number() over(order by id partition by Название) as rn from таблица
)
delete from cte
where rn > 1
4 апр 13, 16:48    [14136835]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1754
Сходу получается так:
DELETE FROM MyTable
WHERE MyTable.ID IN (SELECT
                       rez.ID
                     FROM
                       (SELECT
                          mt.ID,
                          ROW_NUMBER() OVER (PARTITION BY mt.Название ORDER BY mt.ID) AS NNN
                        FROM
                          MyTable mt) rez
                     WHERE
                       rez.NNN <> 1)
4 апр 13, 16:54    [14136872]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
user87
Member

Откуда:
Сообщений: 257
Всем большое спасибо
4 апр 13, 17:01    [14136910]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Maxx
;with cte as (
   select n =row_number() over(order by Название)
   from table
)
delete from cte where n>1

Хм... ответ неверный?
4 апр 13, 17:09    [14136952]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Гость333,

да :( не проверил,сорри -partition by n
4 апр 13, 17:15    [14136988]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Maxx
Гость333,

да :( не проверил,сорри -partition by n
И это тоже неверно
partition by Название
4 апр 13, 17:19    [14137002]     Ответить | Цитировать Сообщить модератору
 Re: В какую сторону копать  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Maxx
Гость333,

да :( не проверил,сорри -partition by n
И это тоже неверно
partition by Название

да ето я уже у себя в тестовом примере прогонял,и лень было полное имя поля писать на руссском

declare @t table (i int, n nvarchar(100))
insert into @t(i,n)
values (1, 'London'),(2, 'London'),(3,'New York'),(4,'Oslo'),(5, 'New York')
;with cte as (
   select nr =row_number() over(partition by n order by n)
   from @t
)
delete from cte where nr>1
select * from @t
4 апр 13, 17:24    [14137029]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить