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)删除数据,提交。

我要用这种方法去写?要怎么写?
展开
 我来答
开心还亲切灬萨摩
2014-01-23 · 超过44用户采纳过TA的回答
知道小有建树答主
回答量:114
采纳率:100%
帮助的人:87.2万
展开全部
"把重复的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是唯一的,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)
追问
这条语句我用过,删得也很快,查起来就不行了。
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)
追问
要看清楚我问的啊,要用存储过程和游标去删除重复的数据!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-01-23
展开全部
如何定义重复的ID和最大的ID?
追问
select max(fp_id) from a_test group by fp_dm,fp_hm。 这条语句我直接能找出重复的ID和最大的ID!现在主要是用存储和游标去处理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式