2013-07-31 110 views
0

我需要刪除我的數據庫中大約300,000個重複項。我想檢查Card_id列的重複項,然後檢查重複的時間戳。然後刪除一個副本並保留一個副本。例如:SQL檢查一列中的重複項並刪除另一列

| Card_id | Time |  
| 1234 | 5:30 |  
| 1234 | 5:45 |  
| 1234 | 5:30 |  
| 1234 | 5:45 | 

所以剩餘的數據將是:

| Card_id | Time |  
| 1234 | 5:30 |  
| 1234 | 5:45 | 

我嘗試了好幾種不同的DELETE語句,並融合成一個新表,但沒有運氣。

更新:明白了!

很多失敗後,我得到了這個工作的DB2。

delete from(
select card_id, time, row_number() over (partition by card_id, time) rn 
from card_table) as A 
where rn > 1 

當card_id和時間有重複時遞增。重複的或第二個rn將被刪除。

+1

你有一個'id'列唯一標識記錄? –

+0

這個數據沒有唯一的ID。 – Nexus

+0

我們是嚴格處理**重複**還是可以有三個(或更多)相同的行? –

回答

2

我強烈建議你採取這種做法:

create temporary table tokeep as 
    select distinct card_id, time 
    from t; 

truncate table t; 

insert into t(card_id, time) 
    select * 
    from tokeep; 

也就是說,存儲你想要的數據。截斷表格,然後重新生成它。通過截斷表格,您可以保持觸發器和權限以及其他與表格鏈接的內容。

這種方法也應該比刪除許多重複項更快。

如果你要做到這一點,你應該插入一個正確的ID,以及:

create temporary table tokeep as 
    select distinct card_id, time 
    from t; 

truncate table t; 

alter table t add column id int auto_increment; 

insert into t(card_id, time) 
    select * 
    from tokeep; 
+0

+1這是怎麼做到的。 –

+0

如果我還有更多的專欄,這項工作是否會奏效? – Nexus

+0

@Nexus。 。 。這將適用於任何數量的列。 –

0

如果你還沒有Primary keyCandidate key有可能是隻使用一個命令的選項。試試下面的解決方案

創建使用COPY_YourTable

重複

select Card_id,Time 
    into COPY_YourTable 
    from YourTable 
    group by Card_id,Time 
    having count(1)>1 

刪除重複表

delete from YourTable 
    where exists 
    (
    select 1 
    from COPY_YourTable c 
    where c.Card_id = YourTable.Card_id 
    and c.Time = YourTable.Time 
    ) 

複製數據,而無需重複

insert into YourTable 
    select Card_id,Time 
    from COPY_YourTabl