我想实现的是使用一条sql删除只剩下标注的如下数据:
各位大神有办法可以做到吗?
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最小的,但你可以去优化下
这个方案的确可行,只不过在oracle下会存在in 不能超过1000的问题。用exists改写就可以了。非常感谢
@Rod_zhu: 在oracle下会存在in 不能超过1000的问题,我不清楚,主要是工作中用到的基本都是MYSql,SQLserver,pg这3种数据库,谢谢提醒
delete from 表名 where id in(1,3,6)
这里只是简单列出几项数据,实际ID是未知的。所以这个方案不行。而且我1 3 6 ID是我要留下的
是不是想删除重复数据呢?
是的,想删除重复订单ID,留下主键ID最下的那个
@Rod_zhu: 使用分页经常用到的函数PARTITION。
select Id,OrderId,ROW_NUMBER() OVER(PARTITION BY OrderId ORDER BY OrderId asc) NUM
from tb
这样会根据OrderId生成排序编号。删除NUM大于1的即可。
如不能直接删除,可以再进行一次表关联。
你好聪明,能猜到别人在说什么。。。
@steden: 好失望,没有选择我的答案。
从别人的谈话中分析是一项基本技能与要求。博客园中有一些人特别不友好,看不出别人在表达什么或者表达不符合他们的要求,就反过来打击对方。希望不要受到打击。如爱编程的大叔。请看这个http://q.cnblogs.com/q/72917/#a_162302
这种让回答的人猜测问题的问题真的是......
这个是问答社区,不是需求分析社区.
表达能力欠佳,下次写详细点哈
看半天,我也搞不懂在描述什么。
delete from 表名 where id not in(1,3,6)
in 可以删除指定的
not in 可以除指定的外其他都删除