2009-06-25 69 views
4

我在我的數據庫中有一個表,其中有我想要刪除的重複記錄。我不想爲此創建具有不同條目的新表。我想要的是刪除現有表中的重複條目而不創建任何新表。有沒有辦法做到這一點?刪除表中的重複行

id   action 
L1_name  L1_data 
L2_name  L2_data 
L3_name  L3_data 
L4_name  L4_data 
L5_name  L5_data 
L6_name  L6_data 
L7_name  L7_data 
L8_name  L8_data 
L9_name  L9_data 
L10_name  L10_data 
L11_name  L11_data 
L12_name  L12_data 
L13_name  L13_data 
L14_name  L14_data 
L15_name  L15_data 

看到這些都是我的領域:
id是每一行唯一的。
L11_data對於各個操作字段是唯一的。
L11_data具有公司名稱,而行爲具有行業名稱。

所以在我的數據我有公司在L11_data對各自行業的重複名稱。

我想是有是唯一的名稱和公司存儲在作用的特定行業的其他數據。我希望我以一種讓人們能夠理解的方式陳述我的問題。

+1

如果你想要一個代碼的答案,你需要給出具有重複數據的表的模式。此外,您應該在問題上留下SQL標籤以獲得更多觀點,並提高問題得到滿意答覆的可能性。 – Welbog 2009-06-25 11:57:03

回答

12

是,假設你有一個獨特的ID字段,你可以刪除那些除了ID相同,但不具有「最小ID」爲自己的組值的所有記錄。

實施例的查詢:

DELETE FROM Table 
WHERE ID NOT IN 
(
SELECT MIN(ID) 
FROM Table 
GROUP BY Field1, Field2, Field3, ... 
) 

注:

  • 我自由選擇 「表」 和 「ID」 爲代表的名字
  • 字段的列表(「字段1,字段2,.. 「。)應​​該包括除ID
  • 各個領域,這可能是視場和行數的查詢速度慢,但我希望這將是比較好替代品

編輯:如果你沒有一個唯一的索引,我的建議是簡單地添加一個自動增量唯一索引。主要是因爲它是很好的設計,但也因爲它可以讓你運行上面的查詢。

+0

只要ID是數字,這就很酷 – 2009-06-25 13:56:44

4
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols); 

重複獲得NULL,那麼你可以將它們刪除

0
DELETE 
FROM table_x a 
WHERE rowid < ANY (
    SELECT rowid 
    FROM table_x b 
    WHERE a.someField = b.someField 
    AND a.someOtherField = b.someOtherField 
) 
WHERE (
    a.someField, 
    a.someOtherField 
) IN (
    SELECT c.someField, 
    c.someOtherField 
    FROM table_x c 
    GROUP BY c.someField, 
    c.someOtherField 
    HAVING count(*) > 1 
) 

在上面的查詢someField和someOtherField的組合必須獨特識別重複。