Plsql 基于两列串联值删除重复记录
我有一个表,员工有30000条记录。我需要删除基于两列串联的重复记录。例如姓名和职务,如 martin clerk martin clerk 删除记录需要很长时间。有没有人能帮我调整一个查询,或者建议我什么是更好的方法Plsql 基于两列串联值删除重复记录,plsql,Plsql,我有一个表,员工有30000条记录。我需要删除基于两列串联的重复记录。例如姓名和职务,如 martin clerk martin clerk 删除记录需要很长时间。有没有人能帮我调整一个查询,或者建议我什么是更好的方法 提前感谢。创建基于函数的索引可能会提高性能 CREATE INDEX concatindex ON emp (ename||'-'||job); Delete语句如下所示 delete emp a where a.rowid > (select min(rowid) f
提前感谢。创建基于函数的索引可能会提高性能
CREATE INDEX concatindex ON emp (ename||'-'||job);
Delete语句如下所示
delete emp a where a.rowid > (select min(rowid) from emp b where b.ename||'-'||b.job=a.ename||'-'||a.job)
除非您需要在备份表中插入已删除的行,而您的问题并不清楚。如果是这样,我宁愿将行集合到集合中。如果需要详细说明此选项,请留下评论。以下是我的代码更改:
cursor cur_emp
is
select *
from
(select b.*
,row_number()over(partition by concat (concat (b.ename, '-'), b.job) order by ename)cnt
from emp b
) where cnt>1;
我希望这有帮助
SELECT ROWID, ename || '-' || job AS concatenation,
decode(rank() over(PARTITION BY ename || '-' || job ORDER BY ROWID), 1, 'keep', 'delete') AS to_do
FROM emp
ORDER BY ename || '-' || job, ROWID;
嗨,米娜,谢谢你的回复。我已经用分析函数row_number()解决了我的问题,我用光标选择了重复的行。这大大提高了性能,现在只需40秒就可以用6分钟完成任务。
SELECT ROWID, ename || '-' || job AS concatenation,
decode(rank() over(PARTITION BY ename || '-' || job ORDER BY ROWID), 1, 'keep', 'delete') AS to_do
FROM emp
ORDER BY ename || '-' || job, ROWID;