2014-02-11 33 views
2

我有2代表具有相同结构:使用连接在UPDATE查询

| term (varchar(50) utf8_bin) | count (bigint(11)) |

一个表被称为“BIG_TABLE”,而另一个“small_table”。大桌子有〜10M行,small_table有75K。

我想更新small_table,所以count列将从big_table中填充。 我尝试这样做:

UPDATE small_table b SET counter = (SELECT c.counter 
           FROM big_table c 
           WHERE c.term = b.term) 
WHERE term = (SELECT c.term 
       FROM big_table c 
       WHERE c.term = b.term); 

但它只是更新一行...

回答

3

我想你只需要一个JOIN

UPDATE small_table b 
    JOIN big_table c 
    ON c.term = b.term 
SET b.counter = c.counter ; 
2

你并不需要在所有WHERE部分:

UPDATE 
    small_table b 
SET 
    counter = 
     ISNULL 
     (
      (
       SELECT c.counter 
       FROM big_table c 
       WHERE c.term = b.term 
      ), 
      0 
     ) 

想想这样说:

UPDATEsmall_tableSET列中的每一行countercounter找到的值big_table记录WHEREterm的值等于termsmall_table。如果在big_table中找不到任何内容,则只需将counter设置为0即可。

+0

这是有道理的。但是我得到这个错误:“错误1048(23000):列'计数器'不能为空' – Cornwell

+0

这是因为'big_table'中没有相应的记录。更新了我的答案。 –

0

我想下面的查询会帮助你

  UPDATE small_table SET counter = c.counter 
      FROM big_table c INNER JOIN small_table b ON c.term = b.term