删除没有临时表的mysql中的重复条目

时间:2013-08-06 20:09:37

标签: mysql sql

我使用临时表删除了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 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情: -

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

提供的名称和ID是表格中的列

结帐link

答案 1 :(得分:1)

一个可能的解决方案是让MySql通过UNIQUE选项(将错误视为警告)应用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 演示