MySQL 数据清理

Posted

技术标签:

【中文标题】MySQL 数据清理【英文标题】:MySQL Data Cleansing 【发布时间】:2014-02-17 16:18:17 【问题描述】:

我正在尝试清理 mysql 中的一些数据,但我不确定是否是解决以下问题的最有效方法。我有三列 A、B 和 C。它们经常具有相同的值。如果 A & B 相同或 A & C 相同,那么如果可能的话,我想用非 NULL 值填写另一个选项。 B & C 不影响 A 的值。例如:

-------------------
|A    |B    |C    |
-------------------
|1    |2    |3    |
|1    |2    |NULL |
|2    |5    |8    |
|2    |NULL |8    |
|3    |NULL |9    |
|3    |NULL |NULL |
-------------------

在上面的例子中,第2行,C列应该填3,第4行,B列应该填5。当我只有两个选项时,我们相应地填写。因此第 6 行 C 列应为 9,而第 5 行 B 列和第 6 行 B 列都保持 NULL。我如何编写脚本来解决这个问题,如果 B 或 C 不为 NULL,那么我们根据表中的其他值填充它?谢谢。

【问题讨论】:

您可以使用case 编写update 语句。我们非常乐意帮助您编写脚本,但到目前为止您有什么尝试? 【参考方案1】:

这有点复杂,但你可以在一个update 语句中完成:

update table t left outer join
       table tc
       on t.a = tc.a and t.b = tc.b and tc.c is not null left outer join
       table tb
       on t.a = tb.a and t.c = tb.c and tb.b is not null
    set t.c = coalesce(t.c, tc.c),
        t.b = coalesce(t.b, tb.b);

此查询会根据您指定的规则进行自联接以查找新值。每个连接都会带来其中一个值。如果有多个匹配行,则从多行之一中选择任意值。

您可以先运行select 来查看会发生什么:

select *
from   table t left outer join
       table tc
       on t.a = tc.a and t.b = tc.b and tc.c is not null left outer join
       table tb
       on t.a = tb.a and t.c = tb.c and tb.b is not null;



set c = (case when c is null
              then (select c from 

【讨论】:

以上是关于MySQL 数据清理的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据清理

如何清理mysql数据库缓存数据?

根据字段条件清理mysql数据库数据

mysql 数据库清理过期数据的时候失败  提示是删除数据量太大! 怎么办?

清理MySql各种日志

MySQL清理binlog日志的方法