MySQL - Дублирующееся устранение и Сохранение Ценных Данных?

Сценарий: у Меня есть немного дублирующихся контактов в таблице. Дубликаты определяются, я могу просто удалить их, но проблема, я не хочу терять данные, которые мог бы иметь дубликат, и оригинал не делают. Какие-либо подсказки?

Демонстрационные данные:

ID Name Email School Dupe_Flag Key
1  AAA  a@a          X         1 
2  AAB        JKL              1
3  BBB  b@b   MNO    X         2
4  BBC                         2

Желаемый вывод:

ID Name Email School Dupe_Flag Key
1  AAA  a@a          X         1 
2  AAB  a@a   JKL              1
3  BBB  b@b   MNO    X         2
4  BBC  b@b   MNO              2

Как 2 записи связаны?: У них обоих есть то же Значение ключа только с одним столбцом, устанавливающим Dupe_Flag, который является дублирующимся столбцом.

В вышеупомянутом случае идентификатор 1 будет удаленным, но информация об электронной почте из идентификатора 1 должна быть применена к идентификатору 2.

Каковы Данные?: У Меня есть небольшое количество сотни строк и немногих 100 дубликатов. Оператор UPDATE для каждой строки является громоздким и не является выполнимым.

Бизнес-правила для определения, какие данные берут приоритет:

Если столбец от исходной/хорошей записи (Dupe_Flag НЕ установлен) не имеет никаких данных и если соответствующая запись Простофили (имеет то же Значение ключа) столбец имеет данные затем, что исходный рекордный столбец должен быть обновлен.

Любая справка/сценарий действительно ценится! Спасибо парни :)

7
задан ThinkCode 1 March 2010 в 19:18
поделиться

4 ответа

Я не знаю специфики этой проблемы, но, вероятно, лучше избежать этой проблемы, установив для столбцов значение «уникальный», чтобы при попытке запроса создать дубликат не удастся. Я думаю, что элегантное решение этой проблемы - избегать ее в момент ввода данных.

Мне нравится использовать этот запрос для поиска дубликатов:

select * from table group by `Email` having count(Email) > 1
0
ответ дан 7 December 2019 в 20:36
поделиться

Хотя здесь используется набор вложенных SELECTS и на самом деле это не полное решение, оно должно либо вызвать что-то еще, либо, возможно, подтолкнуть в правильном направлении .

select * from 
  (select r1.ID,r1.Name,coalesce(r1.Email,r2.Email) as Email,
  coalesce(r1.School,r2.School) as School,r1.Dupe_Flag,r1.Key from 
  (select * from test1 where Dupe_Flag IS NULL) as r1  left outer join 
  (select * from test1 where Dupe_Flag IS NOT NULL) as r2 on r1.KEY=r2.Key) 
as results

Доходность:

ID  Name  Email  School  Dupe_Flag  Key
2   AAB   a@a    JKL     NULL       1
4   BBC   b@b    MNO     NULL       2

На основе данных вашего примера.

0
ответ дан 7 December 2019 в 20:36
поделиться

Строки уникальны, так что проблем нет. Пожалуйста, перепроверьте данные вашего примера.

-1
ответ дан 7 December 2019 в 20:36
поделиться

Предполагая, что пустые значения являются нулевыми, что-то вроде этого должно вывести нужные данные:

SELECT
  a.ID,
  IF(a.DupeFlag IS NULL, IF(a.Name IS NULL, b.Name, a.Name), a.Name) AS Name,
  IF(a.DupeFlag IS NULL, IF(a.Email IS NULL, b.Email, a.Email), a.Email) AS Email,
  IF(a.DupeFlag IS NULL, IF(a.School IS NULL, b.School, a.School), a.School) as School,
  a.DupeFlag,
  a.key
FROM
  table a,
  table b
WHERE
  a.Key = b.Key AND
  a.ID != b.ID
GROUP BY
  a.ID

Обратите внимание, что превратить это в оператор UPDATE довольно просто

2
ответ дан 7 December 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: