如何使用主键删除SQL表中的重复项

时间:2016-03-15 13:57:28

标签: sql-server duplicates azure-sql-database

例如,请考虑下表。

    +-------+----------+----------+------------+
    | 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         |
    +-------+----------+----------+------------+

1 个答案:

答案 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