2014-02-11 32 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