识别表中的重复项并将重复的记录踢到另一个表

时间:2019-05-27 12:48:48

标签: sql oracle sql-insert

我的表中有一些员工记录,我们正在基于一个名为workno的字段中识别重复记录。我在TABLE_A中的数据如下所示

NAME  WORKNO       DATE
---------------------------
John     30000  09-JAN-2012
Franklin 40000  08-DEC-2014
Alicia   25000  19-JUL-2013
Jennifer 43000  20-JUL-2015
Gary     38000  15-SEP-2016
Joyce    25000  31-JAN-2017
Ahmad    25000  29-MAR-2017
James    55000  10-APR-2017
Jill     43000  12-OCT-2017
Jack     55000  18-JAN-2018

想象一下,这里有将近一百万条记录。因此需要效率方面的帮助

我所需的输出:-

方案1 :将没有重复的记录(基于workno)保留在table_A本身中。在上表中,只有约翰,富兰克林和加里应该在最后,因为他们没有重复的工作编号。

方案2 :特定工作编号(如果有重复的话)的第一条记录应写入table_B。工作编号为25000的“ Alicia”将被踢入Table_B

方案3 :将第一个重复项写入table_B之后,应将其余记录插入table_C中。带有workno的“ Joyce”和“ Ahmad”将被踢入table_C

我尝试编写对方案1和2都适用的查询。如果有更好的方法,则需要帮助。但是插入部分会抛出错误(尽管查询部分工作正常)。

错误报告:

  

SQL错误:ORA-01847:一个月中的某天必须介于1和该月的最后一天之间   01847. 00000-“每月的日期必须在1到该月的最后一天之间”   *原因:
  *动作:

Insert into ztempo
Select *
from (SELECT fname, minit, lname, bdate, address, sex, salary, superssn, dno, 
             ROW_NUMBER() OVER (PARTITION BY salary ORDER BY rownum) num
      from  Select *
            from ztemp 
            where salary in (Select salary from ztemp group by salary having Count(*) > 1)

           )

     )
where num = 1;

我想我可以在场景3的末尾“ where num> 1”处使用相同的代码,但是要进行插入。请帮助

需要帮助来完成它。预先感谢。

2 个答案:

答案 0 :(得分:0)

您收到的错误提示ztempo中的列与ztemp的顺序不同,或者date列是varchar2且包含无效日期,例如“ 2019-FEB-30”

最好以这种方式明确声明您的列,以防表具有相同的列,但顺序不同:

insert into ztempo ( fname, minit, ... )

您正在按子查询中的薪水分组,这真的是您想要做的吗?而且我认为order by rownum子句几乎没有任何作用。

答案 1 :(得分:0)

-场景1:插入其他表后,从源表中删除重复项

Delete from table_a where workno in ( Select workno from table_a group by workno having count(*) > 1);

-场景2:插入第一个重复项

Insert into table_b Select fname, Workno, ord_date
from
(
     SELECT fname, workno, ord_date, 
     ROW_NUMBER() OVER (PARTITION BY workno ORDER BY rownum) num from
     (
     Select * from table_a 
     where workno in (
                      Select workno from table_a group by workno having count(*) > 1
                      )
      )
)
     where num = 1;

-场景3:插入其他重复的行

Insert into table_c Select fname, Workno, ord_date
from
(
      SELECT fname, workno, ord_date, 
      ROW_NUMBER() OVER (PARTITION BY workno ORDER BY rownum) num from
      (
      Select * from table_a 
      where workno in (
                       Select workno from table_a group by workno having count(*) > 1
                       )
       )
)
      where num > 1;

这是检查一百万条记录的有效方法。让我知道是否还有其他解决方案。谢谢!