首页 新闻 会员 周边 捐助

使用一条sql实现删除可以实现吗?

0
[已解决问题] 解决于 2015-07-03 15:17

我想实现的是使用一条sql删除只剩下标注的如下数据:

各位大神有办法可以做到吗?

 

Rod_zhu的主页 Rod_zhu | 初学一级 | 园豆:173
提问于:2015-06-26 13:57
< >
分享
最佳答案
1

delete from 表名 
where   ID in (select ID   from 表名 group by OrderID   having count(OrderID) > 1) 
and   ID not in (select min(ID) from 表名 group by OrderID  having count(OrderID  )>1) 

我帮你写的这个实现的功能是删除OrderID重复的,保留重复中ID最小的,但你可以去优化下

奖励园豆:5
稳稳的河 | 老鸟四级 |园豆:4216 | 2015-06-26 15:39

这个方案的确可行,只不过在oracle下会存在in 不能超过1000的问题。用exists改写就可以了。非常感谢

Rod_zhu | 园豆:173 (初学一级) | 2015-06-27 09:51

@Rod_zhu: 在oracle下会存在in 不能超过1000的问题,我不清楚,主要是工作中用到的基本都是MYSql,SQLserver,pg这3种数据库,谢谢提醒

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-07-13 15:22
其他回答(4)
1

delete from 表名 where id in(1,3,6)

jio92 | 园豆:1064 (小虾三级) | 2015-06-26 14:12

  这里只是简单列出几项数据,实际ID是未知的。所以这个方案不行。而且我1 3 6 ID是我要留下的

支持(0) 反对(0) Rod_zhu | 园豆:173 (初学一级) | 2015-06-26 15:14
1

是不是想删除重复数据呢?

lucika.zh | 园豆:54 (初学一级) | 2015-06-26 15:08

 是的,想删除重复订单ID,留下主键ID最下的那个

支持(0) 反对(0) Rod_zhu | 园豆:173 (初学一级) | 2015-06-26 15:15

@Rod_zhu: 使用分页经常用到的函数PARTITION。

select Id,OrderId,ROW_NUMBER() OVER(PARTITION BY OrderId ORDER BY OrderId asc) NUM 

from tb

这样会根据OrderId生成排序编号。删除NUM大于1的即可。

如不能直接删除,可以再进行一次表关联。

支持(1) 反对(0) lucika.zh | 园豆:54 (初学一级) | 2015-06-26 15:29

你好聪明,能猜到别人在说什么。。。

支持(0) 反对(0) steden | 园豆:187 (初学一级) | 2015-06-28 21:39

@steden: 好失望,没有选择我的答案。

从别人的谈话中分析是一项基本技能与要求。博客园中有一些人特别不友好,看不出别人在表达什么或者表达不符合他们的要求,就反过来打击对方。希望不要受到打击。如爱编程的大叔。请看这个http://q.cnblogs.com/q/72917/#a_162302

支持(0) 反对(0) lucika.zh | 园豆:54 (初学一级) | 2015-07-07 10:43
0

这种让回答的人猜测问题的问题真的是......

这个是问答社区,不是需求分析社区.

吴瑞祥 | 园豆:29449 (高人七级) | 2015-06-26 16:47

表达能力欠佳,下次写详细点哈

支持(0) 反对(0) Rod_zhu | 园豆:173 (初学一级) | 2015-06-27 09:43

看半天,我也搞不懂在描述什么。

支持(0) 反对(0) steden | 园豆:187 (初学一级) | 2015-06-28 21:39
0

delete from 表名 where id not in(1,3,6)

in 可以删除指定的

not in 可以除指定的外其他都删除

fanjf | 园豆:204 (菜鸟二级) | 2015-06-29 09:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册