2013-02-08 125 views
1

我有表稱爲調度程序。它包含以下幾列:如何刪除重複行但保留1基於兩列

ID 
sequence_id 
schedule_time (timestamp) 
processed 
source_order 

我需要從表中刪除重複的行,但保持1列,其中加工= 0

+0

您能給出樣本記錄嗎? –

+0

一個非常簡單的解決方案是 '從表中刪除ID不在(選擇不同記錄的ID)' – Techmonk

回答

1
DELETE yourTable FROM yourTable LEFT OUTER JOIN (
SELECT MIN(ID) AS minID FROM yourTable WHERE processed = 0 GROUP BY schedule_time, source_order 
) AS keepRowTable ON yourTable.ID = keepRowTable.minID 
WHERE keepRowTable.ID IS NULL AND processed = 0 

我申請此職位; P How can I remove duplicate rows? 你見過嗎?

--fixed version--

DELETE yourTable FROM yourTable LEFT OUTER JOIN (
SELECT MIN(ID) AS minID FROM yourTable WHERE processed = 0 GROUP BY schedule_time, source_order 
) AS keepRowTable ON yourTable.ID = keepRowTable.minID 
WHERE keepRowTable.minID IS NULL AND processed = 0 
+0

謝謝,但稍有錯誤keepRowTable.minID,而不是keepRowTable.ID –

+0

感謝您的更正。對不起,我錯了。我已經修復它作爲你的建議。 – ittgung

0

對於MySQL具有特定sequence_id相同schedule_time和source_order

DELETE a from tbl a , tbl b WHERE a.Id>b.Id and 
a.sequence_id= b.sequence_id and a.processed=0; 
+0

查詢需要很多時間來執行。我有3000行 –

+0

嘗試這個http://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql – Meherzad

+0

其執行時間太長。 –

0

刪除重複的最快方法 - 絕對是通過添加索引,迫使他們出來,只留下一個各留在表的副本:

ALTER IGNORE TABLE dates ADD PRIMARY KEY (

    ID 
    sequence_id 
    schedule_time 
    processed 
    source_order 
) 

現在,如果你有一個密鑰,你可能需要刪除它等等,但問題是,當你添加一個帶有IGNORE的唯一密鑰到一個帶有重複項的表中時 - bahavior是刪除所有額外的記錄/重複項。因此,在您添加此密鑰後,您現在只需要再次將其刪除即可創建新的重複項目:-)

現在,如果您需要執行更復雜的過濾(對女巫之一進行復制以保持您可以不只是包含在索引中 - 儘管不太可能),您可以在您選擇並輸入所需內容的同時創建一個表格 - 全部在同一個查詢中:

CREATE TABLE tmp SELECT ..fields.. GROUP BY (..what you need..) 

DROP TABLE original_table 

ALTER TABLE tmp RENAME TO original_table_name