2011-05-29 87 views
3

我有一個表,看起來像這樣刪除重複的行

表1

ID,姓名

我如何編寫一個查詢,刪除所有行重名,但保持一個更低的ID?

+0

創建一個具有唯一行的新表刪除舊的名稱,然後用舊名稱重命名新的名稱,也許你應該儘量避免添加重複的條目 – Ibu 2011-05-29 04:14:24

+4

在完成清理之後,*添加一個UNIQUE約束*名字,所以你不必再做這個工作。 – 2011-05-29 04:21:19

+0

[刪除重複行(不要刪除所有重複項)](http://stackoverflow.com/questions/3777633/delete-duplicate-rows-dont-delete-all-duplicate) – jmort253 2013-11-07 02:16:16

回答

4

如果您使用的是SQL Server 2005或更高版本:

With Dups As 
    (
    Select Id, Name 
     , Row_Number() Over (Partition By Name Order By Id) As Num 
    From Table1 
    ) 
Delete Table1 
Where Id In (
      Select Id 
      From Dups 
      Where Num > 1 
      ) 

如果使用SQL Server 2000和之前

Delete Table1 
Where Exists (
       Select 1 
       From Table1 As T1 
       Where T1.Name = Table1.Name 
       Having Min(T1.Id) <> Table1.Id 
       ) 
0

只要您可以使用光標 查詢可能是這樣做(3030)

申報CR光標選擇ID,名稱來自idnametbl爲了通過ID

用於更新

開放CR未來從CR

提取到@ ID,@名

而@@ FETCH_STATUS = 0

開始

從idnametbl刪除其中id> @id和名稱= @名稱

下一個從CR讀取到ID @,@名

接近CR

DEALLOCATE CR

2

的副本可以用一個簡單的自我聯接查詢被刪除。下面的腳本會爲你解決問題。

delete t2 
from Table1 t1 
join Table1 t2 
    on t1.Name = t2.Name 
where t1.Id < t2.Id 

此邏輯可用於需要刪除重複項的情況。我們應儘可能避免使用「光標」,因爲它會阻止表格。