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

Откуда: Feorina "Fury" 161
Сообщений: 4348
2008r2

Запрос
Select ID, a,b,c,d from MYTABLE
выдаёт 1 000 000 000 записей.

Запрос
Select distinct a,b,c,d from MYTABLE
выдаёт 700 000 000 записей

хочу написать функцию, которая бы удаляла все дубли.
Пришёл к двум решениям:
1. организовать цикл по всем записям и удалять все копии текущей записи - страшно долго. Отметается.
2. Перегнать с помощью второго запроса все уникальные записи в другую таблицу, очистить содержимое первой и перегнать все записи обратно. Вроде даже работает... но нельзя ли сразу убрать все дубли, не перегоняя данные из таблицы в таблицу?
21 июн 16, 13:04    [19318482]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все дубли из таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Charles Weyland,

http://sql-ex.ru/help/select17.php
21 июн 16, 13:20    [19318585]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все дубли из таблицы  [new]
aleks2
Guest
while 1 = 1 begin

  delete top(1000) t
    from MYTABLE as t 
    where exists( select * from MYTABLE where ID < t.ID and not exists( select a, b, c except select t.a, t.b, t.c) )

  if @@rowcount = 0 break

end;
21 июн 16, 13:22    [19318596]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все дубли из таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Быстрее будет перелить в новую таблицу по-моему.
21 июн 16, 14:00    [19318785]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все дубли из таблицы  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
в прочем, ничего нового...
21 июн 16, 14:58    [19319122]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все дубли из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
aleks2
while 1 = 1 begin

  delete top(1000) t
    from MYTABLE as t 
    where exists( select * from MYTABLE where ID < t.ID and not exists( select a, b, c except select t.a, t.b, t.c) )

  if @@rowcount = 0 break

end;
Как-то тут выяснили, что EXISTS(SELECT ... INTERSECT SELECT ...) лучше.
21 июн 16, 15:59    [19319396]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить