2013-11-12 3 views
2

У меня есть следующие таблицы в SQL с линиями порядка следующим образом:Как удалить дубликаты в SQL, но сохранить одну копию?

RowId  OrderId  Type  Text 
---------------------------------------- 
1  1   5  "Sometext" 
2  1   5  "Sometext" 
3  2   4  "Sometext" 
4  3   5  "Sometext" 
5  2   4  "Sometext" 
6  1   3  "Sometext" 

Каждый заказ не может иметь дубликат типа, но может иметь несколько различных типов.

Строки 1 и 2 являются дубликатами для заказа , но строка 6 в порядке.

Строки 3 и 5 дубликаты для заказа .

Мне нужно удалить все дублированные данные, поэтому в этом случае мне нужно удалить строку 2 и строку 5.

Каков наилучший запрос для удаления данных? Или даже просто верните список RowID, содержащий дубликаты, подлежащие удалению (или наоборот, список RowID).

Спасибо.

+0

Вы хотите удалить запись физически из таблицы или просто проигнорировать из набора результатов, который вы хотите запросить –

+0

Удалите их, в противном случае, я думаю, я мог бы группироваться по OrderId и Type :) – Alex

ответ

3

Попробуйте простой подход:

DELETE FROM t 
WHERE rowid NOT IN (
    SELECT min(rowid) FROM t 
    GROUP BY orderid, type 
) 

скрипку here.

Обратите внимание, что при повторении вы хотите сохранить понижение rowid. Вот почему я держу min.

1
;with cte as 
(
Select Row_Number() Over(Partition BY ORDERID,TYPE ORDER BY RowId) as Rows, 
RowId , OrderId , Type , Text from TableName 
) 
Select RowId , OrderId , Type , Text from cte where Rows>1 

Sql Fiddle Demo

1

Пожалуйста, попробуйте:

with c as 
(
    select *, row_number() over(partition by OrderId, Type order by (select 0)) as n 
    from YourTable 
) 
delete from c 
where n > 1; 
Смежные вопросы