根据一列值删除重复行

新手上路,请多包涵

我有下表,现在我需要删除具有重复“refID”但至少有一行带有该引用的行,即我需要删除第 4 行和第 5 行。请帮助我

+----+-------+--------+--+
| ID | refID |  data  |  |
+----+-------+--------+--+
|  1 |  1023 | aaaaaa |  |
|  2 |  1024 | bbbbbb |  |
|  3 |  1025 | cccccc |  |
|  4 |  1023 | ffffff |  |
|  5 |  1023 | gggggg |  |
|  6 |  1022 | rrrrrr |  |
+----+-------+--------+--+

原文由 Jeeppp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 543
2 个回答

这类似于 Gordon Linoff 的查询,但没有子查询:

 DELETE t1 FROM table t1
  JOIN table t2
  ON t2.refID = t1.refID
  AND t2.ID < t1.ID

这使用内部联接仅删除存在具有相同 refID 但 ID 较低的另一行的行。

避免子查询的好处是能够利用索引进行搜索。此查询应该在 refID + ID 上使用多列索引时执行良好。

原文由 Marcus Adams 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种变体,在某些情况下比 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;

希望这会帮助某人。在大桌子上,马库斯回答摊位。

原文由 user2501323 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题