Выявление дубликатов в таблице и добавление дубликатов записей в другую таблицу - PullRequest
0 голосов
/ 27 мая 2019

В моей таблице есть несколько записей о сотрудниках, и мы идентифицируем дубликаты в них на основе одного поля с именем 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.из приведенной выше таблицы в конце должны быть только Джон, Франклин и Гэри, поскольку у них нет дубликатов с workno.

Сценарий 2 : первая запись для конкретного workno (в случае дубликатов)) должно быть записано в table_B.«Алисия» с workno 25000 будет добавлена ​​в Table_B

Сценарий 3 : после записи первого дубликата в table_B оставшиеся записи должны быть вставлены в table_C."Joyce" и "Ahmad" с workno будут добавлены в 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;

Я думаю, что я могу использовать тот же код снекоторые настройки в конце «где num> 1» для сценария 3. Но возникают проблемы при вставке.Пожалуйста, помогите

Нужна помощь в его заполнении.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

- СЦЕНАРИЙ 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;

Это эффективный способ пройти миллион записей. Дайте мне знать, если есть какое-либо другое решение. Спасибо!

0 голосов
/ 27 мая 2019

Ошибка, которую вы получаете, говорит о том, что либо столбцы в ztempo не совпадают с порядком ztemp, либо столбец даты является varchar2 и содержит недопустимые даты, например "2019-FEB-30".

Лучше явно указать ваши столбцы, например, в случае, если таблицы имеют одинаковые столбцы, но в другом порядке:

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

Вы группируете по зарплате в своем подзапросе, действительно ли эточто ты хочешь делать?И я думаю, что предложение order by rownum почти ничего не делает.

...