Plsql 基于两列串联值删除重复记录

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

我有一个表,员工有30000条记录。我需要删除基于两列串联的重复记录。例如姓名和职务,如

martin clerk martin clerk 删除记录需要很长时间。有没有人能帮我调整一个查询,或者建议我什么是更好的方法


提前感谢。

创建基于函数的索引可能会提高性能

 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;