DB2中删除重复记录的方法

在DB2中不象Oracle那样可以借助rowid,rownum等伪列来删除重复的记录,也没有有效的方法可以在一个SQL中直接删除记录.但可以借助row_number() over()语法和视图的方式将重复的记录删除.

下面看一个实际的测试DEMO

 

方法一:借助视图来实现

SQL> create table zrp (no int);
DB20000I SQL命令成功完成。
SQL> insert into zrp values(1);
DB20000I SQL命令成功完成。
SQL> insert into zrp values(1);
DB20000I SQL命令成功完成。
SQL> insert into zrp values(2);
DB20000I SQL命令成功完成。
SQL> insert into zrp values(2);
DB20000I SQL命令成功完成。
SQL> select * from zrp;

NO
-----------
1
1
2
2
4 条记录已选择。

SQL> create view v_zrp as select no,row_number() over(partition by no) as row_seq from zrp;
DB20000I SQL命令成功完成。
SQL> select * from v_zrp;

NO ROW_SEQ
----------- --------------------
1 1
1 2
2 1
2 2

4 条记录已选择。

SQL> delete from v_zrp where row_seq=2;
DB20000I SQL命令成功完成。
SQL> select * from v_zrp;

NO ROW_SEQ
----------- --------------------
1 1
2 1

2 条记录已选择。

SQL> select * from zrp;

NO
-----------
1
2

2 条记录已选择。

SQL>方法二:借助row_number() 函数来实现D:DB2BIN>db2 -td;

SQL> select * from zrp;

NO
-----------
1
1
2
2

4 条记录已选择。

SQL> delete from (select no,row_number() over(partition by no) as row_seq from zrp) t where t.row_seq>1;
DB20000I SQL命令成功完成。
SQL> select * from zrp;

NO
-----------
1
2

2 条记录已选择。

SQL>



补充资料:
select *,row_number() over(order by productname) as rownumber
from products
--上面是正确的,然后我想的是从这个结果集在取10-20之间的数据,然后我书写如下:
select *,row_number() over(order by productname) as rownumber
from products
where rownumber between 10 and 20
--这样报错.然后又找资料看,找不个例子.然后我照那个例子改进
select* from
(select *,row_number() over(order by productname) as rownumber
from products)
as temp
where rownumber between 10 and 20
--这样就对了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值