首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除“重复”记录?

问如何删除“重复”记录?
EN

Stack Overflow用户
提问于 2015-08-21 11:35:28
回答 3查看 63关注 0票数 0

我有一个包含一些损坏记录的表,因为我忘记为两个列添加一个UNIQUE索引。请看下表中的示例:

代码语言:javascript
复制
+----+-------------+--------+------------+
| id | uuid        | object | project_id |
+----+-------------+--------+------------+
| 1  | 73621000001 | screw  | 1          |
| 2  | 73621000002 | screw  | 1          |
| 3  | 73621000003 | screw  | 1          |
| 4  | 73621000004 | tube   | 1          |
| 5  | 73621000005 | plate  | 2          |
| 6  | 73621000006 | plate  | 2          |
| 7  | 73621000007 | plate  | 2          |
| 8  | 73621000008 | plate  | 2          |
| 9  | 73621000009 | plate  | 2          |
| 10 | 73621000010 | gear   | 4          |
| 11 | 73621000011 | gear   | 4          |
+----+-------------+--------+------------+

如您所见,有一些object-project_id-combinations多次发生,但有不同的uuids。我想删除所有重复的记录,但保留那些最高的uuid。由此产生的表格应如下:

代码语言:javascript
复制
+----+-------------+--------+------------+
| id | uuid        | object | project_id |
+----+-------------+--------+------------+
| 3  | 73621000003 | screw  | 1          |
| 4  | 73621000004 | tube   | 1          |
| 9  | 73621000009 | plate  | 2          |
| 11 | 73621000011 | gear   | 4          |
+----+-------------+--------+------------+

我可以使用以下查询查看哪些object具有重复项:

代码语言:javascript
复制
SELECT uuid, object, project_id, COUNT(*)
FROM uuid_object_mapping
GROUP BY object, project_id
HAVING COUNT(*) > 1;

我可以使用以下查询获得“干净”表:

代码语言:javascript
复制
SELECT MAX(uuid) as uuid, object, project_id
FROM uuid_object_mapping
GROUP BY object, project_id;

并且我可以验证“干净”表没有包含重复的

代码语言:javascript
复制
SELECT uuid, object, project_id, COUNT(*)
FROM (
    SELECT MAX(uuid) as uuid, object_name, project_id
    FROM uuid_object_mapping
    GROUP BY object_name, project_id
) AS clean
GROUP BY object_name, project_id
HAVING COUNT(*) > 1;

但是,我如何删除所有不在“干净”表中的内容?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-21 11:39:40

在MySQL中,您可以使用join,但是您需要注意NULL值:

代码语言:javascript
复制
delete om
    from uuid_object_mapping om join
         (select MAX(uuid) as uuid, object, project_id
          from uuid_object_mapping 
          group by object, project_id
         ) omkeep
         on omkeep.object = om.object and
            omkeep.project_id <=> om.project_id
    where om.uuid <> omkeep.uuid;

NULL值似乎已经消失,因此可以使用以下on子句:

代码语言:javascript
复制
         on omkeep.object = om.object and
            omkeep.project_id = om.project_id
票数 2
EN

Stack Overflow用户

发布于 2015-08-21 11:54:17

请使用分区和顺序uuid子句。通过搜索分析。这是去除重复的最佳方法。

票数 0
EN

Stack Overflow用户

发布于 2015-08-21 11:37:45

尝尝这个

代码语言:javascript
复制
select t1.id,t1.uuid,t1.object,t1.project_id from table as t1 inner join
(
select object,max(id) as id from table
group by object
) as t2 on t1.object=t2.object and t1.id=t2.id
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32139297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档