假设这个表:
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。
现在,我想删除连续行中ColA
和ColB
的所有重复项。
在此示例中,行2,3和5,6包含重复项。 这些应被删除,以便保留较高的ID。
输出应为:
ID ColA ColB
1 7 8
3 7 9
4 5 8
6 6 9
7 5 4
如何使用mySQL完成这项工作?
谢谢, 尔根
答案 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);