删除表中重复的记录,是否三条语句都一样?

豆沙包 2012-02-01 11:07:14
1、 delete from aa a1 where not exists( select * from aa a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);


2、 delete from aa where id not in(Select min(id) from aa Group by name,age);
3、delete from aa where id in(Select a2.id from aa a1,aa a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age)
...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
danfer97 2012-02-01
  • 打赏
  • 举报
回复
你把select * 改成select 1 就好了
豆沙包 2012-02-01
  • 打赏
  • 举报
回复
但是我执行的时候第一条sql逻辑有问题
xiaobluesky 2012-02-01
  • 打赏
  • 举报
回复

效率肯定是不一样的
1的效率一般是最高的,采用NOT EXISTS 内层查询是会走索引的..提示下:用select 1 会稍微好点..
3效率一般,in 会走索引
2的差点 采用NOT IN, 11g以下是走全表查询的,11g 效率应该跟2差不多,好像是会走索引的..但因为内层你用的是分组查询,具体不能和其他两个比,但一般情况我记得,分组是要比连接查询效率低点..
没_没_没超疯 2012-02-01
  • 打赏
  • 举报
回复
第一条应该改成这样:
delete from aa a1 where exists( select * from aa a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);
把id大的数据删掉才是正确的。

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧