MySQL删除连续行中的重复项

时间:2011-11-23 14:02:10

标签: mysql duplicates delete-row

假设这个表:

ID ColA ColB
1   7    8
2   7    9
3   7    9
4   5    8
5   6    9
6   6    9
7   5    4

PK是ID coumn。 现在,我想删除连续行中ColAColB的所有重复项。

在此示例中,行2,3和5,6包含重复项。 这些应被删除,以便保留较高的ID。

输出应为:

ID ColA ColB
1   7    8

3   7    9
4   5    8

6   6    9
7   5    4

如何使用mySQL完成这项工作?

谢谢, 尔根

4 个答案:

答案 0 :(得分:2)

CREATE TEMPORARY TABLE duplicates (id int primary key)

INSERT INTO duplicates (id)
    SELECT t1.id
      FROM table t1
      join table t2 on t2.id = t1.id + 1
     WHERE t1.ColA = t2.ColA
       and t1.ColB = t2.ColB

-- SELECT * FROM duplicates --> are you happy with that? => delete
DELETE table
  FROM table
  join duplicates on table.id = duplicates.id

答案 1 :(得分:1)

select ID from MyTable m1 where 0 < (select count(*) from MyTable m2 where m2.ID = m1.ID - 1 and m2.ColA = m1.ColA and m2.ColB = m1.ColB)

然后你可以使用

delete from MyTable where ID in ...

查询。这样它肯定适用于任何版本。

答案 2 :(得分:0)

根据您拥有的记录数量,这可能不是最有效的:

SELECT (SELECT TOP 1 id FROM table WHERE colA = m.colA AND colB = m.colB ORDER BY id DESC) AS id, m.*
FROM (SELECT DISTINCT colA, colB
      FROM  table) m

可能存在语法错误,因为我通常使用mssql,但这个想法应该是类似的。

答案 3 :(得分:0)

我称第一个表'测试'。

首先创建一个表格,其中包含ColA和ColB的所有相同组合:

create temporary table tmpTable (ColA int, ColB int);
insert into tmpTable select ColA,ColB from test group by ColA, ColB;

现在,为原始表格中的每个相同的ColA和ColB组合选择最大ID。将它放入一个新表(称为idsToKeep,因为这些是我们不想删除的行):

create temporary table idsToKeep (ID int);
insert into idsToKeep select (select max(ID) from test where test.ColA=tmpTable.ColA and test.ColB=tmpTable.ColB) from tmpTable;

最后,删除原始表中不在idsToKeep表中的所有条目:

delete from test where ID <> all (select ID from idsToKeep);