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

Откуда:
Сообщений: 1907
Есть таблица у которой есть id и несколько полей(допустим 5) f1 f2 f3 f4 f5

Задача удалить из таблицы дубликаты. Дубликатами являются строки у которых равны одновременно поля(f1 - f5)

Вроде нагуглил решение на SO, но не понимаю как оно работает - помогите плиз разобраться

http://stackoverflow.com/a/18949/2674303

DELETE MyTable 
FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL
4 апр 15, 00:08    [17472470]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
redwhite90,

какой RowId, у вас Оракл что ли?
подтвердите сперва сервер, и если все же Microsoft SQL Server, опубликуйте select @@version,
от нее будет длина решения зависеть
4 апр 15, 00:18    [17472498]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o
redwhite90,

какой RowId, у вас Оракл что ли?
подтвердите сперва сервер, и если все же Microsoft SQL Server, опубликуйте select @@version,
от нее будет длина решения зависеть


вообще судя по тегам вопроса это sql сервер.

Но нужно кросс серверное решение на простом sql
4 апр 15, 00:41    [17472544]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o
redwhite90,

какой RowId, у вас Оракл что ли?
подтвердите сперва сервер, и если все же Microsoft SQL Server, опубликуйте select @@version,
от нее будет длина решения зависеть


RowID это название колонки ID
4 апр 15, 00:42    [17472546]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
а принцип решения ок, универсальный.
в каждой группе одинаковых строк надо оставить одну.
ну вот они и выбрали для "оставляния" с минимальным RowId.
т.е. если теперь исходную таблицу "левосоединить" с отобранными строками (по одной на каждую группу),
то не нашедших себе пары в соединении (у кого в паре NULL) и нужно удалить.
(то ж еще надо оценить, сколько всего удалять.
а то может проще те самые KeepRows в новую таблицу вписать, а старую дропнуть)

RowId у ораклоидов имеется даром, а вам придется внутри каждой группы самому нумеровать.
ну или не придется, если все же Оракл :)
4 апр 15, 00:42    [17472550]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
redwhite90
RowID это название колонки ID

у вас есть гарантия, что у строк с одинаковыми f1-f5 id РАЗЛИЧНЫ?
тогда нумеровать не надо, можете тем решением воспользоваться.

RowId -- это не название колонки, это действительно Rowid, и он гарантированно уникален.
а про ваше id никто ничего не знает
4 апр 15, 00:47    [17472568]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o,

у вас есть гарантия, что у строк с одинаковыми f1-f5 id РАЗЛИЧНЫ?


по моим данным уникальность primary key на совести базы
4 апр 15, 00:50    [17472573]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o,

автор
RowId -- это не название колонки, это действительно Rowid, и он гарантированно уникален


кликните на ссылку в первом посте
4 апр 15, 00:51    [17472575]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
redwhite90
по моим данным уникальность primary key на совести базы

а где-то у вас сказано, что id -- это PK?
тут дофигище народу объявят id identity и свято верят, что этим задали уникальность.
по ссылке да, вижу, что PK.
а в вашем первом посте об этом ни слова.
а по названию колонки, извините, писал ораклоид.
вот, тоже сходите по ссыкле: ROWID Pseudocolumn
4 апр 15, 01:02    [17472588]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o
redwhite90
по моим данным уникальность primary key на совести базы

а где-то у вас сказано, что id -- это PK?
тут дофигище народу объявят id identity и свято верят, что этим задали уникальность.
по ссылке да, вижу, что PK.
а в вашем первом посте об этом ни слова.
а по названию колонки, извините, писал ораклоид.
вот, тоже сходите по ссыкле: ROWID Pseudocolumn


я джавист вообще, но про бд общие вещи тож знать надо(без особенностей какого-либо сервера)
4 апр 15, 01:06    [17472594]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
redwhite90
Но нужно кросс серверное решение на простом sql

еще раз: то решение -- универсальное.
при условии уникальности одной из колонок (id, RowId, да хоть f0)
4 апр 15, 01:07    [17472597]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
o-o
redwhite90
Но нужно кросс серверное решение на простом sql

еще раз: то решение -- универсальное.
при условии уникальности одной из колонок (id, RowId, да хоть f0)


Да, спасибо, я понял)

Для меня сложность была в том как бы эти строки найти, а оказывается легко) groupBy
4 апр 15, 01:10    [17472603]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
redwhite90
я джавист вообще, но про бд общие вещи тож знать надо(без особенностей какого-либо сервера)

надо просто приводить все исходные данные.
если вы взяли чей-то код, основанный на уникальности одной из колонок,
то об этом или надо было сказать, или можно было привести скрипт таблицы, вопросов бы не возникло.
например, ораклоидам для работы приведенного кода не нужна такая колонка т.к. у них есть этот "псевдостолбец" RowId,
а для таблиц SQL Server-а такой столбец необходимо самому заводить, и если его нет, его можно сгенерить,
но способ генерации различен для разных версий.
вы ж запостили в конкретную ветку и не сразу уточнили, что вам универсальное решение надо
4 апр 15, 01:15    [17472614]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
redwhite90
Для меня сложность была в том как бы эти строки найти, а оказывается легко) groupBy

дело не в group by, а как раз в наличии уникального значения на группу.
можете потом выбирать min или max,
но если уникальности нет, то и group by не поможет,
для всей группы абсолютно все одинаковое -- что будем с этим делать?
4 апр 15, 01:19    [17472619]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
aleks2
Guest
DELETE T 
FROM  ( SELECT *, row_number() over(partition by Col1, Col2, Col3...) n  FROM MyTable ) as T 
WHERE  n > 1;

-- или совсем универсально... 
select * into #MyTable from MyTable group by Col1, Col2, Col3... -- жаль тут * низзя
delete MyTable;
insert MyTable select * from #MyTable;
drop #MyTable;
4 апр 15, 08:30    [17472849]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
aleks2
DELETE T 
FROM  ( SELECT *, row_number() over(partition by Col1, Col2, Col3...) n  FROM MyTable ) as T 
WHERE  n > 1;

-- или совсем универсально... 
select * into #MyTable from MyTable group by Col1, Col2, Col3... -- жаль тут * низзя
delete MyTable;
insert MyTable select * from #MyTable;
drop #MyTable;
row_number без order by не бывает
4 апр 15, 08:42    [17472868]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
aleks2
DELETE T 
FROM  ( SELECT *, row_number() over(partition by Col1, Col2, Col3...) n  FROM MyTable ) as T 
WHERE  n > 1;

-- или совсем универсально... 
select * into #MyTable from MyTable group by Col1, Col2, Col3... -- жаль тут * низзя
delete MyTable;
insert MyTable select * from #MyTable;
drop #MyTable;

row_number без order by не бывает
И звездочка в первом select -лишняя
4 апр 15, 08:44    [17472875]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
o-o
Guest
aleks2
-- или совсем универсально... 
select * into #MyTable from MyTable group by Col1, Col2, Col3... -- жаль тут * низзя
delete MyTable;
insert MyTable select * from #MyTable;
drop #MyTable;

да ладно, было бы желание :)
меняем group by на distinct
и delete на truncate:
-- или совсем универсально... 
select distinct * 
into #MyTable 
from MyTable;
 
truncate MyTable;

insert MyTable 
select * 
from #MyTable;

drop #MyTable;
5 апр 15, 00:44    [17474759]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
zero_air
Member

Откуда:
Сообщений: 53
Почему все так сложно ? Вот наглядно и читабельно
Declare @TempT table (id int,f1 varchar(10), f2 varchar(10), f3 varchar(10), f4 varchar(10), f5 varchar(10))
insert into @TempT
select  1,'F1','F1','F1','F1','F1' union all
select  2,'F1','F1','F1','F1','F1' union all
select  3,'F1','F1','F1','F1','F1' union all
select  4,'F3','F1','F1','F1','F1' union all
select  5,'F2','F2','F2','F2','F2' union all
select  6,'F2','F2','F2','F2','F2' ;   

   
WITH CTE(ID,N) AS
(
    SELECT tmp.id,
           row_number() over(
               partition by f1,f2,f3,f4,f5
               order by tmp.id
           ) AS rw

    FROM   @TempT tmp  
)
DELETE CTE WHERE N>1;  
6 апр 15, 11:32    [17477860]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
iap
Member

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

дык, aleks2 написал же уже...
А у Вас зачем там tmp.id в SELECTе? (мелочь, конечно...)
6 апр 15, 11:46    [17477942]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
zero_air
Member

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

точно, не обратил внимание что такой вариант уже предложили. :(
6 апр 15, 11:49    [17477967]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
delete from a
from @TempT a inner join @TempT b on a.f1 = b.f1 and a.f2 = b.f2 and a.f3 = b.f3 and a.f4 = b.f4 and a.f5 = b.f5 and a.id > b.id
6 апр 15, 11:53    [17477992]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
GuestNoob
Guest
Glory,

Сорри, возможно, за оффтоп: А как удалить строки дубликаты вместе со строкой оригиналом? (Т. е. если 2 строки одинаковы, то удалить обе)
7 апр 15, 22:39    [17485726]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
ватсон ватсон что с тобой
Guest
GuestNoob,

минус последнее условие
7 апр 15, 22:57    [17485814]     Ответить | Цитировать Сообщить модератору
 Re: удалить дубликаты из таблицы  [new]
tsvetashov
Member

Откуда:
Сообщений: 1
Подскажите, как быть в моем случае... предположим, что в таблице есть несколько записей и у каждой из них есть несколько дубликатов, отличие только в ID. Надо удалить дубликаты и оставить записи с минимальным ID, вопрос в том, как это выполнить одним запросом а не выполнять один запрос для каждого дубликата?
27 апр 15, 23:12    [17572707]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить