我想找到一种方法来填充记录中缺少的数据,这些记录的数据与电子邮件所匹配的数据不同。
我有一张桌子,里面有姓名,地址,城市,州,邮编和电子邮件。像这样
kim,,,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,,,,kim@domain.com
我想要做的是删除重复项,而不是丢失相关数据。所以我想用每个记录填充那里的数据,然后删除欺骗。并不总是有记录包含所有细节,如第二个。有时可能没有任何记录包含所有数据。
理想情况下,我希望最终得到以下内容,以便每条记录都有尽可能多的字段。如果一个字段有两个或更多不同的记录,我可以从第一个填写。
我希望这是一个公平的解释
kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
答案 0 :(得分:1)
你没有提供任何代码所以我必须与我一起即兴创作。我有两个表t1和t2,其中t2是t1的完全副本(您可以尝试创建表的副本或使用自联接,我不确定它是否适用于此)。它对我有用:
update t2,t1 set t2.first_name=
case when t2.first_name=''
then t1.first_name
else t2.first_name end
where t2.actor_id=t1.actor_id
and t1.first_name!='';
我为一个名为first_name的列做了这个。修改查询并将其应用于您的表。所以你有两个选择:
这是我的例子
mysql> select * from t2 limit 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+--------------+---------------------+
| 1 | | GUINESS | 2012-06-29 08:36:22 |
| 2 | | WAHLBERG | 2012-06-29 08:36:22 |
| 3 | | CHASE | 2012-06-29 08:36:22 |
| 4 | | DAVIS | 2012-06-29 08:36:22 |
| 5 | | LOLLOBRIGIDA | 2012-06-29 08:36:22 |
| 6 | | NICHOLSON | 2012-06-29 08:36:22 |
| 7 | | MOSTEL | 2012-06-29 08:36:22 |
| 8 | | JOHANSSON | 2012-06-29 08:36:22 |
| 9 | | SWANK | 2012-06-29 08:36:22 |
| 10 | CHRISTIAN | GABLE | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)
mysql> select * from t1 order by actor_id limit 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+--------------+---------------------+
| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |
| 1 | a | | 0000-00-00 00:00:00 |
| 2 | NICK | WAHLBERG | 2006-02-15 04:34:33 |
| 3 | ED | CHASE | 2006-02-15 04:34:33 |
| 4 | JENNIFER | DAVIS | 2006-02-15 04:34:33 |
| 5 | JOHNNY | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
| 6 | BETTE | NICHOLSON | 2006-02-15 04:34:33 |
| 7 | GRACE | MOSTEL | 2006-02-15 04:34:33 |
| 8 | MATTHEW | JOHANSSON | 2006-02-15 04:34:33 |
| 9 | JOE | SWANK | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)
mysql> update t2,t1 set t2.first_name=case when t2.first_name='' then t1.first_name else t2.first_name end where t2.actor_id=t1.actor_id and t1.first_name!='';
Query OK, 9 rows affected (0.03 sec)
Rows matched: 200 Changed: 9 Warnings: 0
mysql> select * from t2 limit 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+--------------+---------------------+
| 1 | PENELOPE | GUINESS | 2012-06-29 08:37:34 |
| 2 | NICK | WAHLBERG | 2012-06-29 08:37:34 |
| 3 | ED | CHASE | 2012-06-29 08:37:34 |
| 4 | JENNIFER | DAVIS | 2012-06-29 08:37:34 |
| 5 | JOHNNY | LOLLOBRIGIDA | 2012-06-29 08:37:34 |
| 6 | BETTE | NICHOLSON | 2012-06-29 08:37:34 |
| 7 | GRACE | MOSTEL | 2012-06-29 08:37:34 |
| 8 | MATTHEW | JOHANSSON | 2012-06-29 08:37:34 |
| 9 | JOE | SWANK | 2012-06-29 08:37:34 |
| 10 | CHRISTIAN | GABLE | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)