DB2数据库中,删除表中的重复数据,可以使用如下语句:
delete from (
select 1 from (select a,b,c,row_number()
over(partition by a,b,c order by a,b,c)
as row_num
from tab) as e
where row_num >1)
对于AS400上面的DB2,可以使用ROWID()函数获取需要删除的数据的行号,再进行删除。
若要每次删除表中的多条数据,并且在批量删除之后提交事物,可以如下处理:
delete from (select 1 from tablename
where condition
fetch first N rows noly)
N表示每次需要删除的数据数量。
下面是个测试:
创建测试表
create table clb_test(
empno char(8) not null,
ename varchar(20),
sex char(1),
hiredate date)
使用存储过程进行多条数据添加,注意存储过程的使用
create procedure tst_insert()
language sql
specific tst_insert --指定唯一的标识
isrt:begin
--
declare v_i smallint default 0;
declare v_empno char(9) default '';
declare v_hiredate date;
declare v_sex char(1);
--使用循环进行数据添加
repeat
set v_i = v_i +1;
set v_empno = 'CLB'||digits(v_i);
set v_sex = (case when mod(v_i,2)=0 then 'F' else 'M' end);
if (v_i=1) then
set v_hiredate = current date;
else
set v_hiredate = v_hiredate + 1 days;
end if;
insert into clb_test(empno,ename,sex,hiredate)
values(v_empno,'ChenLinbo',v_sex,v_hiredate);
--没添加100条数据,提交一次
if ((v_i/100) = 0) then
commit work;
end if;
--注意,until语句结尾不能有分号结尾符号(;)
until v_i = 999
end repeat;
end isrt
每个标识一定要有结束,比如存储过程体结束(end isrt)对应开始(isrt:begin)。
执行添加数据的存储过程之前,表中无数据:
db2 => select *from clb_test
EMPNO ENAME SEX HIREDATE
-------- -------------------- --- ----------
0 条记录已选择。
对于无参存储过程,调用的时候不用给出参数,若有参数则必须指定参数。
db2 => call tst_insert()
返回状态 = 0
调用tst_insert存储过程之后,表中添加了999条数据:
db2 => select count(*) from clb_test
1
-----------
999
1 条记录已选择。
db2 => select *from clb_test fetch first 10 rows only
EMPNO ENAME SEX HIREDATE
-------- -------------------- --- ----------
CLB00001 ChenLinbo M 2013-04-30
CLB00002 ChenLinbo F 2013-05-01
CLB00003 ChenLinbo M 2013-05-02
CLB00004 ChenLinbo F 2013-05-03
CLB00005 ChenLinbo M 2013-05-04
CLB00006 ChenLinbo F 2013-05-05
CLB00007 ChenLinbo M 2013-05-06
CLB00008 ChenLinbo F 2013-05-07
CLB00009 ChenLinbo M 2013-05-08
CLB00010 ChenLinbo F 2013-05-09
10 条记录已选择。
一次性删除多条数据,可以使用select语句先获取一次性删除的数据数量,再进行delete,如下:
create procedure tst_delete(out p_batches int)
language sql
specific tst_delete
dlt:begin
declare sqlstate char(5) default '00000';
declare rows_deleted int default 0;
declare v_return int default 0;
repeat
delete from (select 1 from clb_test
where year(hiredate) < year(date('2015-01-01'))
fetch first 10 rows only);
get diagnostics rows_deleted = row_count;
set v_return = v_return + rows_deleted;
commit;
until rows_deleted=0
end repeat;
return v_return;
end dlt
调用存储过程tst_delete
db2 => call tst_delete(?)
输出参数的值
--------------------------
参数名: P_BATCHES
参数值: -
返回状态 = 0
db2 => select count(*) from clb_test
1
-----------
388
1 条记录已选择。
db2 => select *from clb_test order by hiredate fetch first 10 rows only
EMPNO ENAME SEX HIREDATE
-------- -------------------- --- ----------
CLB00612 ChenLinbo F 2015-01-01
CLB00613 ChenLinbo M 2015-01-02
CLB00614 ChenLinbo F 2015-01-03
CLB00615 ChenLinbo M 2015-01-04
CLB00616 ChenLinbo F 2015-01-05
CLB00617 ChenLinbo M 2015-01-06
CLB00618 ChenLinbo F 2015-01-07
CLB00619 ChenLinbo M 2015-01-08
CLB00620 ChenLinbo F 2015-01-09
CLB00621 ChenLinbo M 2015-01-10
10 条记录已选择。
--the end--