楼主: stone10

删除重复行SQL优化

[复制链接]
论坛徽章:
0
21#
发表于 2005-3-18 15:11 | 只看该作者
例子:
如有表test,test有四个字段:a,b,c,d.其中a为主关键字段.
对于b,c,d三个字段重复的记录, 只留下一条记录,其余的删除.

代码如下:

delete from test
   where a in
   (
   select a
   from (
         select a,b,c,d
                rank() over (partition by b,c,d order by a nulls last) tmp
         from (
              select a,b,c,d
              from  test
              where a in
                    (select a,
                       from test
                      group by b,c,d
                     having count(*) > 1
                             )
                   )
                 )
   where tmp >1
   );

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
22#
发表于 2005-3-18 15:16 | 只看该作者
最初由 ZALBB 发布
[B]ALTER TABLE work.zbxsrsz  ADD CONSTRAINT UNIQUE zbxsrsz_key (xr_bm,xr_jyrq,xr_jh,xr_xh)
indexing tablespace TS_NAME EXCEPTION INTO exception_table.

然后根据exception_table的记录查询后决定是否删除这些重复的记录。 [/B]


不错.楼主不妨试试该方法

另外:
delete work.zbxsrsz a where exists
( select * from work.zbxsrsz
where xr_bm = a.xr_bm
and xr_jyrq = a.xr_jyrq
and xr_jh = a.xr_jh and xr_xh < a.xr_xh
and xr_jyrq > to_Date('2005.03.13','yyyy.mm.dd')
and xr_jyrq < to_Date('2005.03.15','yyyy.mm.dd') )
改写为:
delete work.zbxsrsz a where rowid >
( select min(rowid) from work.zbxsrsz
where xr_bm = a.xr_bm
and xr_jyrq = a.xr_jyrq
and xr_jh = a.xr_jh
and xr_xh  = a.xr_xh
and xr_jyrq = a.xr_jyrq
)
试试.

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2005-3-18 15:55 | 只看该作者
wlidflower
版主

我的那个代码你测了没有,效率怎么样啊?

我以前用过它删除了1000万条记录中的24万的冗余数据,用的时间还没有50分钟!!!

使用道具 举报

回复
论坛徽章:
1
24#
 楼主| 发表于 2005-3-18 15:58 | 只看该作者
经典!姜还是老的辣!
服了,百分感谢!可以浪费了很多时间!
:)

使用道具 举报

回复
论坛徽章:
31
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
25#
发表于 2005-3-18 16:01 | 只看该作者
最初由 stone10 发布
[B]经典!姜还是老的辣!
服了,百分感谢!可以浪费了很多时间!
:) [/B]


你说哪个方法好啊?

使用道具 举报

回复
论坛徽章:
31
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
26#
发表于 2005-3-18 16:02 | 只看该作者
最初由 MingTian_0125 发布
[B]wlidflower
版主

我的那个代码你测了没有,效率怎么样啊?

我以前用过它删除了1000万条记录中的24万的冗余数据,用的时间还没有50分钟!!! [/B]


这个方法应该不会跟我提供关于ROWID的方法效率高

使用道具 举报

回复
论坛徽章:
31
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
27#
发表于 2005-3-18 16:04 | 只看该作者
最初由 husthxd 发布
[B]

不错.楼主不妨试试该方法

另外:
delete work.zbxsrsz a where exists
( select * from work.zbxsrsz
where xr_bm = a.xr_bm
and xr_jyrq = a.xr_jyrq
and xr_jh = a.xr_jh and xr_xh < a.xr_xh
and xr_jyrq > to_Date('2005.03.13','yyyy.mm.dd')
and xr_jyrq < to_Date('2005.03.15','yyyy.mm.dd') )
改写为:
delete work.zbxsrsz a where rowid >
( select min(rowid) from work.zbxsrsz
where xr_bm = a.xr_bm
and xr_jyrq = a.xr_jyrq
and xr_jh = a.xr_jh
and xr_xh  = a.xr_xh
and xr_jyrq = a.xr_jyrq
)
试试. [/B]


husthxd ,还是你老大心细啊
哈哈
像热心的husthxd 致敬!
不过我对你那么多奖章很有打算哦
呵呵

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2005-3-18 16:09 | 只看该作者
^_^
其实我得那个方法,我一般是用来删除和业务相关垃圾数据和冗余数据!

向大佬们学习啊!!!

使用道具 举报

回复
论坛徽章:
31
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
29#
发表于 2005-3-18 16:12 | 只看该作者
最初由 MingTian_0125 发布
[B]^_^
其实我得那个方法,我一般是用来删除和业务相关垃圾数据和冗余数据!

向大佬们学习啊!!! [/B]


如果考虑效率,理解各个写法的依据就比较好些
不过总体来说在大量数据中执行DELETE是比较痛苦的事情

使用道具 举报

回复
论坛徽章:
1
30#
 楼主| 发表于 2005-3-18 16:44 | 只看该作者
太痛苦了!
我现在不想说是谁的SQL好,方正一句话,都很慢!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表