我有以下两个表:
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中,User
和Value
字段都是唯一的,不应出现多次。两个表都没有主键。
答案 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
。