MySQL-消除重复并保留有价值的数据?

MySQL-消除重复并保留有价值的数据?,mysql,duplicates,Mysql,Duplicates,场景:我在一个表中几乎没有重复的联系人。重复项已被识别,我可以直接删除它们,但问题是我不想丢失重复项可能拥有的数据,而原始项可能没有。有什么建议吗 样本数据: 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        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
这两个记录是如何关联的?:它们都具有相同的键值,只有一列设置了Dupe_标志,即重复列

在上述情况下,ID 1将被删除,但ID 1中的电子邮件信息应应用于ID 2

数据是什么我有几百行和几百个副本。每行的UPDATE语句都很繁琐,不可行

确定哪些数据优先的业务规则:

如果原始/良好记录(未设置Dupe_标志)中的列没有数据,并且如果相应的Dupe记录(具有相同的键值)列有数据,则应更新该原始记录列


非常感谢任何帮助/脚本!谢谢大家:)

我不知道这个问题的具体细节,但是最好通过将列设置为“唯一”来避免这个问题,这样如果一个查询试图创建一个重复的列,它就会失败。我认为解决这个问题的最佳方法是在数据输入点避免它

我喜欢使用此查询来跟踪复制品:

select * from table group by `Email` having count(Email) > 1

行是唯一的,因此没有问题。请重新检查您的示例数据。

虽然这使用了一系列嵌套的选择,并且不是一个完整的解决方案,但它应该引发其他问题,或者可能朝着正确的方向推进

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

基于您的示例数据。

假设空值为null,类似这样的内容应输出所需的数据:

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语句中转换这个词是非常直接的,

我们怎么才能看到你认为哪些行是重复的?我们如何知道你认为哪些列中的列比你想要保留的行中的相应列更有价值?如果没有规范,您就无法自动执行操作。您首先需要定义自己的业务规则,以确定在发生冲突时哪些数据具有优先级。Dupe_标志表示该数据是重复的。哪些数据优先真的很简单。如果原始(良好)记录的任何列为NULL,并且如果重复记录中的相同列不为NULL,那么我们只更新这些列。为了清楚起见,更新了我的问题。非常感谢。这只是样本数据。我现在有了钥匙,只是有些联系人的名字和中间名不同,因此,我们不能通过程序的方式锁定复制。只有手动查看才能识别,因此出现了问题:(顺便说一句,我将电子邮件设置为unique,示例数据仅用于说明目的。谢谢..只有手动查看才能告诉您(或允许您猜测)哪一个数据更正确。使用不同的中间名,哪一个是正确的?一个程序不会知道。有时,至少在您的示例中,即使它看起来像一个副本,但它实际上是一个单独的记录(两个同名的人)。相信我,伙计们,我们有重复检测检查。我想知道的是最简单/有效的方法来挽救与重复记录关联的数据。谢谢!我实际上是在尝试消除对每一列的查询需求,因为真实数据有这么多列。到目前为止,一个理想的解决方案是使用PYTHON脚本来存储所有列umns在一个数组中,检查是否有任何有价值的数据,并更新原始列。下面由Benoit Vidis提供的解决方案完全符合您的要求。非常感谢!我的问题仍然是因为这只是示例数据,实际上我有数百个列,因此每个列上的更新语句都不会起作用:(再次感谢!