2017-05-19 44 views
0

我正在嘗試將一堆條目插入表中的MySQL。有很多我需要擺脫的半副本。我想刪除除一個之外的所有半副本。當我運行下面的代碼時,它似乎正在刪除我不希望被刪除的所有內容,只保留具有多個半重複項的條目。如何刪除其中一個半副本,同時還保留其他所有條目?使用MySQL刪除數據庫中的重複項

delete from t where (ColA, ColB, ColC) in 
(select * from (select ColA, ColB, ColC from t 
group by ColA, ColB, ColC having count(*) > 1) as t); 
+0

你的表中有任何id列嗎? – GurV

+0

我這樣做,但是我使用的數據可以有不同的主鍵,同時是半重複的 – Swell

回答

0

好了,我不認爲你可以解決這個問題,而無需使用where 但使用同一個表

爲例從我的數據庫無法操作上DELETE一個SELECT WHERE

delete from tb_test where idtb_test not in (
select idtb_test from tb_test T1 
WHERE T1.title in (select title from tb_test T2 group by T2.title having count(*) =1) 
) 

此查詢搜索col標題上的非重複行並刪除除選定行以外的所有行

MySQL錯誤:

錯誤代碼:1093。你不能在FROM子句

0

如果我理解正確,指定目標表「tb_test」的更新 ,要刪除幾乎所有有重複的行,而且你不關心哪一個保持未刪除狀態。
另外,據我所知 - 這張表有主鍵。

在這種情況下,它可以與此查詢來完成:

delete test_table t3 
where t3.id in (
    select t1.id 
    from test_table t1, 
     (
      select col_a, col_b, col_c 
      from test_table 
      group by col_a, col_b, col_c 
      having count(*) > 1 
     ) s1 
    where t1.col_a = s1.col_a 
     and t1.col_b = s1.col_b 
     and t1.col_c = s1.col_c 
     and t1.id != (
      select min(t2.id) 
      from test_table t2 
      where t1.col_a = t2.col_a 
       and t1.col_b = t2.col_b 
       and t1.col_c = t2.col_c 
      group by col_a, col_b, col_c 
     ) 
    ) 

基本上,這個查詢刪除所有重複的行除了那些用最少的ID,這是在我的情況下PK。

PS:這適用於Oracle DB,現在無法在MySQL中測試。

+0

幾乎是正確的。主鍵始終是唯一的,但其他多個字段將相同。我知道如果所有的字段都是相同的,那麼這些重複的條目可以被刪除,減去需要保留的條目。 – Swell

+0

我的答案中的查詢完全是這樣的 - 對於具有相同col_a,col_b和col_c的每一組行,它將刪除它們中的所有行,除了那個集合中具有最小主鍵的行。 – fen1x