我有下表,现在我需要删除具有重复"refIDs"的行,但至少有一行与该ref,即我需要删除第4行和第5行.请帮我这个
+----+-------+--------+--+
| ID | refID | data | |
+----+-------+--------+--+
| 1 | 1023 | aaaaaa | |
| 2 | 1024 | bbbbbb | |
| 3 | 1025 | cccccc | |
| 4 | 1023 | ffffff | |
| 5 | 1023 | gggggg | |
| 6 | 1022 | rrrrrr | |
+----+-------+--------+--+
Run Code Online (Sandbox Code Playgroud)
Mar*_*ams 15
这类似于Gordon Linoff的查询,但没有子查询:
DELETE t1 FROM table t1
JOIN table t2
ON t2.refID = t1.refID
AND t2.ID < t1.ID
Run Code Online (Sandbox Code Playgroud)
这使用内部联接仅删除具有相同refID但ID较低的另一行的行.
避免子查询的好处是能够利用索引进行搜索.此查询应该与refID + ID上的多列索引一起使用.
小智 5
我会做:
delete from t where
ID not in (select min(ID) from table t group by refID having count(*) > 1)
and refID in (select refID from table t group by refID having count(*) > 1)
Run Code Online (Sandbox Code Playgroud)
标准是 refId 在重复项中,并且 ID 与重复项中的 min(id) 不同。如果 refId 被索引的话效果会更好
否则,前提是您可以多次发出以下查询,直到它不删除任何内容
delete from t
where
ID in (select max(ID) from table t group by refID having count(*) > 1)
Run Code Online (Sandbox Code Playgroud)
另一种变体,在某些情况下比 Marcus 和 NJ73 的答案快一点:
DELETE ourTable
FROM ourTable JOIN
(SELECT ID,targetField
FROM ourTable
GROUP BY targetField HAVING COUNT(*) > 1) t2
ON ourTable.targetField = t2.targetField AND ourTable.ID != t2.ID;
Run Code Online (Sandbox Code Playgroud)
希望这会对某人有所帮助。在大桌子上,马库斯回答摊位。
| 归档时间: |
|
| 查看次数: |
14789 次 |
| 最近记录: |