2016-01-25 41 views
7

我有以下两个表:SQL:通过映射更新表中的两列彼此

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



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

我的工作是把user从表A(及其correspondings value),然后将其映射到表B并在那里插入这些值。所以从上面的例子表B应该是这样的运行脚本后:

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

我的问题是如何构建一个SQL查询,将在一个有效的方式做到这一点对我来说,如果表A中包含30万+条目和表B包含70,000个条目?

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

+3

所以,如果你有一个对应的b值为1的用户有2个值其中哪一个值应该用于更新? – Mihai

+2

如果表A中同一'user'有多行,哪行的'value'应复制到B? –

+0

好问题@AlanHadsell - 无论哪一行被复制都无关紧要 - 它可以是表A的“值”列中的第一个或最后一个值。 – user1775598

回答

7

可能是这个

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

你的问题是不清楚如何处理那些已经在b任何值。如果你想保持现有的值不匹配,然后用inner join

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

:如果您使用left join,那么这些将明确设置为NULL

请注意,这可能效率不高,但如果a(user)上存在索引,应该可以。

如果您在a中的用户非常少,而且有很多重复项,那么您在进行连接之前可能需要汇总a

+0

感谢您的详细回复。大约有5万用户,并且有很多副本(共300K行)。目前在任何一个表上都没有索引。我能够为这些表添加索引吗?或者当我创建表时,我必须完成这些工作? 你是什么意思汇总表a? – user1775598

+0

他的表的最佳索引是'table_a(user,value)'。 –

1

在现实世界中,您希望获得可预测的值,例如对于任何给定的user最大的value。在这种情况下,你会想要

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