2016-01-25 76 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