Удаление дубликатов и хранение одной копии - PullRequest
0 голосов
/ 29 мая 2019

Я просматривал темы об удалении дубликатов из таблицы и сохранении одной копии. Я видел иллюстрацию в случае, если у вас есть таблица с составным ключом. У кого-нибудь есть идея?

таблицас составным ключом checkno, salary_month, sal_year

delete (select * from CONTR t1
    INNER JOIN
 (select CHECKNO, SALARY_YEAR,SALARY_MONTH FROM CONTR 
group by CHECKNO, SALARY_YEAR,SALARY_MONTH HAVING COUNT(*) > 1) dupes 
ON 
t1.CHECKNO = dupes.CHECKNO AND
t1.SALARY_YEAR= dupes.SALARY_YEAR AND
t1.SALARY_MONTH=dupes.SALARY_MONTH);

Я ожидал, что один дубликат будет удален, а другой сохранен.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Вы можете использовать этот запрос ниже, чтобы удалить дубликаты, используя rowid как имеющий столбец с уникальным значением:

delete contr t1
 where rowid <
     (
      select max(rowid)
        from contr t2
       where t2.checkno = t1.checkno
         and t2.salary_year = t1.salary_year
         and t2.salary_month = t1.salary_month
      );

Демо

1 голос
/ 29 мая 2019

Еще один способ добиться этого, если у вас есть дуплексы с 3 упомянутыми вами столбцами:

  1. Создать временную таблицу с различными значениями
  2. Удалить таблицу
  3. Переименуйте временную таблицу

Особенно, если вы работаете с огромным объемом данных, этот способ будет намного быстрее, чем удаление.

Если данные дублирования, над которыми вы работаете, являются подмножеством вашихВ основной таблице шаги будут:

  1. Создать временную таблицу с различными значениями
  2. Удалить все столбцы dup из основной таблицы
  3. Вставить данные из временной таблицы в основную таблицу

SQL для первого шага будет

create table tmp_CONTR AS 
select distinct CHECKNO, SALARY_YEAR,SALARY_MONTH   -- this part can be modified to match your needs 
  from CONTR t1;
...