2016-03-15 84 views
1

作为示例,请考虑下表。如何使用主键删除SQL表中的重复项

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

显示我们预期的结果。 – jarlh

+0

你正在使用哪些DBMS(包括版本)? – mustaccio

+0

@mustaccio我正在使用RazorSQL来访问Azure SQL数据库。 – acecabana

回答

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