1

我想找到一种方法来填充从有数据的记录到没有电子邮件匹配的记录中的缺失数据。

我有一张桌子,上面有姓名、地​​址、城市、州、邮编和电子邮件。像这样

kim,,,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,,,,kim@domain.com

我想要做的是删除重复项而不丢失相关数据。所以我想用那里的数据回填每条记录,然后删除重复项。并不总是有一张像第二张那样包含所有细节的唱片。有时可能没有包含所有数据的任何记录。

理想情况下,我希望得到以下结果,因此每条记录都有尽可能多的可用字段。如果一个字段有 2 个或更多不同的记录,我可以从第一个开始填写。

我希望这是一个公平的解释

kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
kim,Longmont,CO,55555,kim@domain.com
4

1 回答 1

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 的列做的。修改查询并将其应用于您的表。所以你有2个选择:

  1. 添加其他表并进行一个大查询。
  2. 对要更改的每一列多次应用相同的查询 1...

这是我的例子

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)
于 2012-06-29T12:39:52.453 回答