SQL:通过将两列相互映射来更新表

时间:2016-01-25 12:40:21

标签: mysql sql database

我有以下两个表:

        Table A
+-------------------+
|___User___|__Value_|
|    3     |  a     |
|    4     |  b     |
|    5     |  c     |
|____6_____|__d_____|



        Table B
+-------------------+
|___User___|__Value_|
|    1     |        |
|    4     |        |
|    5     |        |
|____9_____|________|

我的工作是从表A中取user(及其对应的value),然后将其映射到表B并在那里插入这些值。因此,从上面的示例中,在运行脚本后,表B应如下所示:

        Table B
+-------------------+
|___User___|__Value_|
|    1     |        |
|    4     |  b     |
|    5     |  c     |
|____9_____|________|

我的问题是,如果表A包含300,000个条目且表B包含70,000个条目,我如何构建一个能够以有效的方式为我执行此操作的SQL查询?

注意:在表A中,User字段不是唯一的,Value字段也不是唯一的。但是,在表B中,UserValue字段都是唯一的,不应出现多次。两个表都没有主键。

3 个答案:

答案 0 :(得分:7)

可能是这个

update table_b as b 
inner join table_a as a on a.User = b.User
set b.value = a.value 

答案 1 :(得分:1)

在实际情况中,您更有可能想要一个可预测的值,例如任何给定value的最大值user。在这种情况下,你会想要

update table_b as b
inner join (
   select user, max(value) from table_a
   group by user ) as a_max on a.user = b.user
set b.value = a_max.value

答案 2 :(得分:0)

您的问题不清楚如何处理b中已有的任何值。如果您使用left join,那么这些将明确设置为NULL

update table_b b left join
       table_a a
       on a.User = b.User
    set b.value = a.value;

如果您想保留不匹配的现有值,请使用inner join

请注意,这可能效率低下,但如果a(user)上存在索引,则应该没问题。

如果a中的用户很少且有很多重复项,那么您可能希望在加入之前汇总a