各位 crud 大佬,如何一句 SQL 删除没有主键表中的重复数据?

2019-07-03 22:24:01 +08:00
 ace12

如题,我已经在网上搜过了。。并没有找到合适的解决办法,都基本上有主键的,要不然就是对表的重复项顺序有要求

4918 次点击
所在节点    MySQL
17 条回复
jugelizi
2019-07-03 22:36:40 +08:00
。。。换个思路 group 导出后删除原始数据再恢复
sker101
2019-07-03 22:45:14 +08:00
搜索了下 试试
CREATE TABLE temp SELECT DISTINCT * FROM tablename;
ALTER TABLE tablename RENAME junk;
ALTER TABLE temp RENAME tablename;
ace12
2019-07-03 22:48:01 +08:00
@sker101 气人的就是这一点,只能写一句,多句的我也知道
dusu
2019-07-03 22:51:55 +08:00
没索引…做倒排是性能+速度+稳定的不错选择
Iamnotfish
2019-07-03 23:02:40 +08:00
面向谷歌编程:
DELETE TOP (SELECT COUNT(*) -1 FROM dbo.duplicateTest WHERE ID = 1)
FROM dbo.duplicateTest
WHERE ID = 1 但是只能删除指定 ID 的重复数据
leishi1313
2019-07-04 00:04:11 +08:00
先做一个 group by rank,重复去的数据视为在一个 group,然后外面再套个 delete where rank > 1 就好了。具体你先搜“ SQL group by rank ”,各家不一样看你用什么数据库了
txy3000
2019-07-04 00:24:05 +08:00
一句 SQL 什么鬼 炫技吗?
jingyulong
2019-07-04 00:32:28 +08:00
有个思路,利用 top 来做,先 groupby,得出重复数量,top (重复数量-1 ),卧槽,跟楼上有点像
msg7086
2019-07-04 02:18:12 +08:00
重复数据就开 LIMIT 啊。
比如一个表只有一个字段,里面有两条重复数据,那你 DELETE WHERE 条件 LIMIT 1 就好了嘛。
msg7086
2019-07-04 02:19:28 +08:00
一句 SQL 是真的意义不大吧……
c6h6benzene
2019-07-04 02:39:32 +08:00
删除重复数据跟有没有主键没有关系吧,你可以按重复项用 ROW_NUMBER()之类的排个序,然后把所有 number>1 的全删了。
xuanbg
2019-07-04 07:49:30 +08:00
delete a from table a
join (select id from table group by id having count(id) > 1) b on b.id = a.id
xuanbg
2019-07-04 07:58:33 +08:00
上面的 sql 写错了一点,又不能修改,还不能写新的 SQL。。。。总之是根据重复字段分组,然后取某个字段的最大值或最小值,按这个字段的值做 join 条件,就能把这一条数据删掉了
JerryV2
2019-07-04 08:04:36 +08:00
Oracle 乱入
delete from table where rowid not in (select max(rowid) from table group by a, b, c, d );
[狗头]
real3cho
2019-07-04 10:24:32 +08:00
解决业务问题的话 纠结一句就是钻牛角尖 其他情况的话 当我没说
7654
2019-07-04 10:28:21 +08:00
老哥稳,为何要一条 SQL 解决问题
realpg
2019-07-04 10:37:05 +08:00
想起了多年前面试一个 java 商业软件转 PHP 的
面试考点是一个不能直接简单 SQL 解决的删除问题
考察点就是性能 最优解 把数据库无法有效利用索引的部分代入 PHP 循环进行计算,把复杂查询变换为多个可有效利用索引高效的简单查询

这大哥可好,一副很牛逼的样子 20 分钟后给了我一句文本内容将近 4KB 的 SQL 解决问题……

上模拟测试库执行时间将近 2 秒……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX