2013-08-06 39 views
0

我已經使用臨時表刪除了mysql表中的重複行。有沒有可能不使用它?我搜查了很多,但沒有找到任何解決方案。在沒有臨時表的情況下刪除mysql中的重複條目

 
number | status | service 
1234 | A | x1 
1234 | D | x1 
1234 | D | x1 
1234 | A | x2 
1234 | D | x2 
2345 | A | x1 

我的基本需求是,應該只有一個行,它是一個特定的數字和服務instatus d。在表中有很多條目的

+2

這要看情況。你必須更具體一些,並提供表架構,樣本數據,期望的結果 – peterm

+0

可能重複的[刪除重複的記錄,而不創建臨時表](http://stackoverflow.com/questions/8590010/delete-duplicate-records-沒有創建臨時表) –

+0

@PreetSangha:沒有那個解決方案dosnt套件我的要求。 –

回答

1

一種可能解決方法是讓MySql執行約束條件的作業(IGNORE選項(將錯誤作爲警告處理),從而有效地重複刪除表格

ALTER TABLE Table1 ENGINE MyISAM; -- this obviously needed only if your ENGINE is not MyISAM 
ALTER IGNORE TABLE Table1 ADD UNIQUE (`number`, `status`, `service`); 
ALTER TABLE Table1 ENGINE InnoDB; -- again this is only needed if your ENGINE was other than MyISAM 

後,你會得到:

 
| NUMBER | STATUS | SERVICE | 
----------------------------- 
| 1234 |  A |  x1 | 
| 1234 |  A |  x2 | 
| 1234 |  D |  x1 | 
| 1234 |  D |  x2 | 
| 2345 |  A |  x1 | 

下面是SQLFiddle演示


由於 ...還有一個列是連續號碼,自動遞增... 另一種選擇是使用這樣的查詢

DELETE t 
    FROM Table1 t JOIN 
(
SELECT number, status, service, MAX(serial) serial 
    FROM Table1 
GROUP BY number, status, service 
HAVING COUNT(*) > 1 
) q ON t.number = q.number 
    AND t.status = q.status 
    AND t.service = q.service 
    AND t.serial <> q.serial 

結局都是一樣的:

 
| SERIAL | NUMBER | STATUS | SERVICE | 
-------------------------------------- 
|  1 | 1234 |  A |  x1 | 
|  4 | 1234 |  A |  x2 | 
|  3 | 1234 |  D |  x1 | 
|  5 | 1234 |  D |  x2 | 
|  6 | 2345 |  A |  x1 | 

這裏是SQLFiddle演示

+0

尋求幫助 –

1

你可以嘗試這樣的事情: -

DELETE t1 FROM table t1, table t2 WHERE t1.name = t2.name AND t1.id > t2.id; 

提供姓名和身份證都在表中的列

結帳這個link

+0

我不能使用運算符,因爲它是一個重複的字符。 –

相關問題