2016-03-15 122 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