例如,请考虑下表。
+-------+----------+----------+------------+
| ID(PK)| ClientID | ItemType | ItemID |
+-------+----------+----------+------------+
| 1 | 4 | B | 56 |
| 2 | 8 | B | 54 |
| 3 | 276 | B | 57 |
| 4 | 8653 | B | 25 |
| 5 | 3 | B | 55 |
| 6 | 4 | B | 56 |
| 7 | 4 | B | 56 |
| 8 | 276 | B | 57 |
| 9 | 8653 | B | 25 |
+-------+----------+----------+------------+
我们有一个进程导致我们需要删除的重复项。在上面的示例中,客户端4,276和8653应该只有一个ItemType / ItemID组合。如何删除我不需要的额外行。所以在这个例子中,我需要删除ID(PK)6,7,8,9的所有行内容。现在这需要更大规模的发生,所以我不能一个接一个地进入并删除行。是否有查询将识别不是最低ID(PK)的所有ID(PK),以便我可以删除它们?我正在想象一个在子查询上运行的删除语句,但我愿意接受建议。我已经尝试创建一个rownumber来识别重复项,但是,因为该表有一个PK所有行都是唯一的,所以这对我没用。
谢谢!
编辑:这是预期的结果
+-------+----------+----------+------------+
| ID(PK)| ClientID | ItemType | ItemID |
+-------+----------+----------+------------+
| 1 | 4 | B | 56 |
| 2 | 8 | B | 54 |
| 3 | 276 | B | 57 |
| 4 | 8653 | B | 25 |
| 5 | 3 | B | 55 |
+-------+----------+----------+------------+
答案 0 :(得分:2)
您可以使用CTE
:
;WITH ToDelete AS (
SELECT ROW_NUMBER() OVER (PARTITION BY ClientID, ItemType, ItemID
ORDER BY ID) AS rn
FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1