2013-11-21 72 views
0

我有一個表有5列,而不是更新,我做了插入所有行(愚蠢的錯誤)。如何擺脫重複的記錄。除了id以外,它們是相同的。我無法刪除所有記錄,但我想刪除其中的一半。SQL刪除幾乎相同的行

ex。表:

+-----+-------+--------+-------+ 
| id | name | name2 | user | 
+-----+-------+--------+-------+ 
| 1 | nameA | name2A | u1 | 
| 12 | nameA | name2A | u1 | 
| 2 | nameB | name2B | u2 | 
| 192 | nameB | name2B | u2 | 
+-----+-------+--------+-------+

如何做到這一點? 我正在使用Microsoft Sql Server。

+0

我想你可以在這裏找到你的解決方案:http://support.microsoft.com/kb/139444 – Hawk

回答

-1

請嘗試:

with c as 
(
    select 
     *, row_number() over(partition by name, name2, [user] order by id) as n 
    from YourTable 
) 
delete from c 
where n > 1; 
2

嘗試以下。

DELETE 
FROM MyTable 
WHERE ID NOT IN 
(
SELECT MAX(ID) 
FROM MyTable 
GROUP BY Name, Name2, User) 

這是未經測試,因此可能需要適應。以下視頻將爲您提供有關此查詢的更多信息。

Video

+1

我會用MIN,而不是MAX (這樣可以保存大概舊的記錄),並且我建議OP將其他相關列(如果存在)添加到組中,以避免誤報。但是這個解決方案應該可以工作 – oerkelens

+0

是的,謝謝指出。 MIN會比MAX更好 –

0

這比@TechDo更具體的查詢,因爲我覺得在那裏的名字,NAME2和用戶是相同的,不僅名稱重複。

with duplicates as 
(
    select t.id, ROW_NUMBER() over (partition by t.name, t.name2, t.[user] order by t.id) as RowNumber 
    from YourTable t 
) 

delete duplicates 
where RowNumber > 1 

SQLFiddle演示自己嘗試一下:DEMO