oracle中有一张A表,如下图,现在要求用存储过程和游标把重复的ID删掉,保留一条最大的ID,应该怎么写?
表的数据有上百上千万,不要影响效率!在线等!1:先找到有重号数据的(fp_hm、fp_dm、要保留的记录的id)保存的游标中。2:遍历游标,按(fp_hm等于、fp_dm...
表的数据有上百上千万,不要影响效率!在线等!
1:先找到有重号数据的(fp_hm、fp_dm、要保留的记录的id)保存的游标中。
2:遍历游标,按(fp_hm等于、fp_dm等于、不等于要保留的记录的id)删除数据,提交。
我要用这种方法去写?要怎么写? 展开
1:先找到有重号数据的(fp_hm、fp_dm、要保留的记录的id)保存的游标中。
2:遍历游标,按(fp_hm等于、fp_dm等于、不等于要保留的记录的id)删除数据,提交。
我要用这种方法去写?要怎么写? 展开
展开全部
"把重复的ID删掉,保留一条最大的ID"
这句话有问题,id有重复,就是有一样的,怎么在保留最大的。
明白了,这样写:
CREATE OR REPLACE PROCEDURE test_pro(v_khlx IN VARCHAR2,
v_message out varchar2) is
TYPE TCUR IS REF CURSOR;
cur TCUR;
v_id varchar2(1000);
v_fp_dm varchar2(1000);
v_fp_hm varchar2(1000);
BEGIN
open cur for ' select max(fp_id),fp_dm,fp_hm from a_test group by fp_dm,fp_hm';
loop
fetch cur
into v_id,v_fp_dm,v_fp_hm ;
exit when cur%notfound;
delete from a_test t where t.fp_dm = v_fp_dm and t.fp_hm = v_fp_hm and t.fp_id != v_id ;
end loop;
close cur;
commit;
dbms_output.put_line('');
END;
这句话有问题,id有重复,就是有一样的,怎么在保留最大的。
明白了,这样写:
CREATE OR REPLACE PROCEDURE test_pro(v_khlx IN VARCHAR2,
v_message out varchar2) is
TYPE TCUR IS REF CURSOR;
cur TCUR;
v_id varchar2(1000);
v_fp_dm varchar2(1000);
v_fp_hm varchar2(1000);
BEGIN
open cur for ' select max(fp_id),fp_dm,fp_hm from a_test group by fp_dm,fp_hm';
loop
fetch cur
into v_id,v_fp_dm,v_fp_hm ;
exit when cur%notfound;
delete from a_test t where t.fp_dm = v_fp_dm and t.fp_hm = v_fp_hm and t.fp_id != v_id ;
end loop;
close cur;
commit;
dbms_output.put_line('');
END;
追问
看我上面的图,ID是唯一的,fp_hm和fp_dm数据重复,我现在要用存储和游标去删除,就是删2条ID,留一条!
追答
delete from a_test t where t.fp_dm = v_fp_dm and t.fp_hm = v_fp_hm and t.fp_id != v_id ;
上面这句话就搞定你这个问题
ID是唯一的,fp_hm和fp_dm数据重复,我现在要用存储和游标去删除,就是删2条ID,留一条!
2014-01-23
展开全部
delete from table1
where fp_id in (select fp_id from table1group by fp_id
having count(fp_id) > 1)
and rowid not in (select max(rowid) from table1group by fp_id having count(fp_id)>1)
where fp_id in (select fp_id from table1group by fp_id
having count(fp_id) > 1)
and rowid not in (select max(rowid) from table1group by fp_id having count(fp_id)>1)
追问
这条语句我用过,删得也很快,查起来就不行了。
1:先找到有重号数据的(fp_hm、fp_dm、要保留的记录的id)保存的游标中。
2:遍历游标,按(fp_hm等于、fp_dm等于、不等于要保留的记录的id)删除数据,提交。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-23
展开全部
delete from A a where rowid !=(select max(rowid)
from A b where a.fp_id=b.fp_id)
from A b where a.fp_id=b.fp_id)
追问
要看清楚我问的啊,要用存储过程和游标去删除重复的数据!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-23
展开全部
如何定义重复的ID和最大的ID?
追问
select max(fp_id) from a_test group by fp_dm,fp_hm。 这条语句我直接能找出重复的ID和最大的ID!现在主要是用存储和游标去处理
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询