从数据库表中删除重复记录

时间:2014-06-21 12:54:50

标签: mysql duplicate-removal

我正在使用

  

mysql Ver 14.14 Distrib 5.5.35,for debian-linux-gnu(x86_64)using   readline 6.2

我的mysql数据库表中有一个情况,我有重复的记录,奇怪的是这些记录在 itemCode 之间有一个额外的空间。

例如,

mysql> select * from tbl_item;
+--------+-----------------+---------------------------+
| itemId | itemCOde        | itemdescription           |
+--------+-----------------+---------------------------+
|      1 | 0001 1234567    | Test description data     |
|      2 | 0001  1234567   | Test description data     |
|      3 | 0120 21113      | dummy data                |
|      4 | 0120  21113     | dummy data                |
|      5 | 145 78953       | hello world               |
|      6 | 487 77787       | testing data              |
+--------+-----------------+---------------------------+

通过运行以下查询,我可以找到所有重复的记录:

mysql> select itemId, itemCode, itemDescription, count(*) as count from tbl_item Group By itemDescription having count(*) > 1;
+--------+-----------------+---------------------------+-------+
| itemId | itemCode        | itemdescription           | count |
+--------+-----------------+---------------------------+-------+
|      1 | 0001 1234567    | Test description data     |   2   |
|      3 | 0120 21113      | dummy data                |   2   |
+--------+-----------------+---------------------------+-------+

但是现在,我想如何删除 itemCode 之间的空间和额外空间的记录。有什么建议吗?

mysql> desc tbl_item;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| itemID          | int(11)      | NO   | PRI | NULL    | auto_increment |
| itemCode        | varchar(50)  | NO   |     | NULL    |                |
| itemDescription | varchar(200) | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

1 个答案:

答案 0 :(得分:1)

使用此查询,您应该找到具有相同描述和更短itemCode的另一个条目的项目。

     SELECT tbl_item.* 
     FROM tbl_item
     INNER JOIN tbl_item AS t2
      ON t2.itemDescription = tbl_item.itemDescription
      AND LENGTH(t2.itemCode) < LENGTH(tbl_item.itemCode)

通过这个,您可以找到所有条目,其中没有其他条目具有相同的描述和较短的itemCode。所以正确的条目。这个结果可以插入表副本中,然后重命名。

     SELECT tbl_item.* 
     FROM tbl_item
     LEFT JOIN tbl_item AS t2
      ON t2.itemDescription = tbl_item.itemDescription
      AND LENGTH(t2.itemCode) < LENGTH(tbl_item.itemCode)
     WHERE t2.itemId IS NULL