2

我在 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 行是 Order 1的重复项,但第 6 行很好。

第 3 行和第 5 行是 Order 2的重复项。

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

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

谢谢。

4

3 回答 3

3

尝试一个简单的方法:

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

在这里拉小提琴。

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

于 2013-11-12T06:08:15.840 回答
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 小提琴演示

于 2013-11-12T06:05:51.360 回答
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;
于 2013-11-12T06:07:01.880 回答