2016-05-20 47 views
0

所以我在這裏有一個需要刪除重複記錄的情況。 這裏的情景是我有5個關鍵字段。 4個字段是實際數據,第5個是自動生成的唯一編號。 因此,當我使用只檢查這四個字段的組來檢查計數時,我有大約400條記錄的重複。但是這些重複記錄的唯一編號是不同的(我們可以刪除具有唯一編號的最大值的記錄)。 有沒有辦法刪除這些重複記錄? 這些還有6個其他非主鍵字段,但它們僅供參考。使用SQL刪除表中的重複記錄

說,例如:

+----------+-------+---------+---------+-----------+ 
| Field | Field | Field 3 | Field 4 | Unique,Id | 
| 1  | 2 |   |   |   | 
+----------+-------+---------+---------+-----------+ 
| Batman | 100 | 50  | Chicago | 100  | 
+----------+-------+---------+---------+-----------+ 
| Batman | 100 | 50  | Chicago | 101  | 
+----------+-------+---------+---------+-----------+ 
| Superman | 50 | 50  | Florida | 102  | 
+----------+-------+---------+---------+-----------+ 
| Flash | 90 | 40  | London | 103  | 
+----------+-------+---------+---------+-----------+ 
| Flash | 90 | 40  | London | 104  | 
+----------+-------+---------+---------+-----------+ 

在這個例子中,前4個字段是實際的數據字段。

所以你可以看到蝙蝠俠和閃光燈有重複的值(前4個字段),但唯一的ID是不同的。所以在這裏我需要從每個記錄中刪除一條記錄,以便它們不會保留爲重複記錄。可以刪除該重複記錄的唯一標識符的最大值。所以102和104是蝙蝠俠和Flash的最大唯一ID值,它們應該被刪除。

請幫我解決這個問題。

+1

MySQL或MS SQL服務器?不要標記不涉及的產品。 – jarlh

+1

無論哪個dbms,這是一個非常古老的問題,可以很容易找到,如果搜查。 –

+0

「重複」問題的諷刺被標記爲重複! –

回答

-1

你可以用CTE來做。

WITH cte as (
select 
ROW_NUMBER() OVER (PARTITION BY FIELD1 ORDER BY ID) FirstOcurrence, 
* 
from mySuperHeroTable 
) 
delete from cte where FirstOcurrence <> 1 

編輯:

我會建議你在字段1添加Unique constraint運行刪除後。這樣你不會再遇到這種情況。

ALTER TABLE mySuperHeroTable ADD CONSTRAINT UQ_mySuperHeroTable_Field1 UNIQUE (Field1); 
+0

我們不應該劃分所有四個領域? –

+0

這隻會保留第一個蝙蝠俠行和第一個閃存行(按ID(ASC)排序)。當然超人排是獨一無二的。 – mxix

+0

我明白這一點。其實,閱讀這個問題,我想可能會出現Field 1蝙蝠俠有超過1行,但是2,3和4字段有不同的值。我們可能想要保留它們,因爲在整個行中不會重複。但無論如何,看起來情況並非如此。帕爾蘇只需要蝙蝠俠一排,無論場地2,3和4如何。 –

0

請嘗試此查詢:

DELETE 
FROM 
    MYTABLE 
FROM 
    MYTABLE 
LEFT JOIN 
(
SELECT 
    FIELD1,FIELD2,FIELD3,FIELD4,MIN(ID) AS ID 
FROM 
    MYTABLE 
GROUP BY 
    FIELD1,FIELD2,FIELD3,FIELD4 
)TbMain 
ON 
    MYTABLE.FIELD1=TbMain.FIELD1 
    AND 
    MYTABLE.FIELD2=TbMain.FIELD2 
    AND 
    MYTABLE.FIELD3=TbMain.FIELD3 
    AND 
    MYTABLE.ID =TbMain.ID 
WHERE 
    TbMain.ID IS NULL