我的表中有一些员工记录,我们正在基于一个名为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”处使用相同的代码,但是要进行插入。请帮助
需要帮助来完成它。预先感谢。
答案 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;
这是检查一百万条记录的有效方法。让我知道是否还有其他解决方案。谢谢!