如何删除SQL中的重复项但保留一份副本?

时间:2013-11-12 06:02:18

标签: sql sql-server

我在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行与订单 1 重复,但第6行正常。

第3行和第5行与订单 2 重复。

我需要删除所有重复的数据,因此在这种情况下我需要删除第2行和第5行

删除数据的最佳查询是什么?或者甚至只返回包含要删除的重复项的 RowID 的列表(或者相反,要保留 RowID 的列表)?

感谢。

3 个答案:

答案 0 :(得分:3)

尝试一种简单的方法:

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

小提琴here

请注意,您似乎希望在重复时保持较低的rowid。这就是为什么我要保留min

答案 1 :(得分: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

答案 2 :(得分: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;