2011-11-30 166 views
29

我想在有幾個加入一個語句來更新表。雖然我知道的加入其實並不重要的順序(除非你使用的是優化提示),我命令他們以某種方式是最直觀的閱讀。但是,這會導致我想更新的表不是我開始使用的表,並且在更新時遇到問題。MySql的更新連接表

的想什麼,我做一個虛擬的例子是這樣的:

UPDATE b 
FROM tableA a 
JOIN tableB b 
    ON a.a_id = b.a_id 
JOIN tableC c 
    ON b.b_id = c.b_id 
SET b.val = a.val+c.val 
WHERE a.val > 10 
    AND c.val > 10; 

有大約與更新很多帖子加入這裏然而他們總是有表首先被更新。我知道這在SQL Server中是可能的,希望它可能在MySQL中也是可行的!

+0

你需要把''之前從...'SET b.val = a.val + c.val'。見http://stackoverflow.com/questions/2334712/sql-server-update-from-select – Gerben

+0

這個例子後,從已成立,並實例更新連接順序的第一個表。我想更新連接順序中的表格。 – Zugwalt

+0

這應該不重要。即使它可以改變連接的順序('tableB b JOIN tableA a ON a.a_id = b.a_id')。 – Gerben

回答

78

在MySQL中多表UPDATE語法是從Microsoft SQL Server不同,你不需要說哪桌,你在更新,這是你的SET子句中隱含的。

UPDATE tableA a 
JOIN tableB b 
    ON a.a_id = b.a_id 
JOIN tableC c 
    ON b.b_id = c.b_id 
SET b.val = a.val+c.val 
WHERE a.val > 10 
    AND c.val > 10; 

沒有FROM子句中MySQL的句法。

使用JOIN進行更新不是標準SQL,MySQL和Microsoft SQL Server都已將自己的想法實現爲標準語法的擴展。

+0

ORDER BY和LIMIT不使用加入的 – zloctb

+0

@zloctb,是的,這是一個很好的提示!出於某種原因,MySQL的多表UPDATE語法不支持ORDER BY和LIMIT。參看http://dev.mysql.com/doc/refman/5.6/en/update.html –

0

link應該給你,MySQL需要和here就是一個例子的語法。你爲什麼需要加入這兩張桌子?是否限制記錄更新?我問,因爲你也可以做類似如下:

update B set B.x=<value> 
    where 
B.<value> is in(
    select A.y 
     from A left outer join B on A.<value>=B.<value> 
) 
+0

該示例更新連接順序中的第一個表。我想更新連接順序中的表格。 – Zugwalt

3

你有錯的語句的順序。您可以在語法here讀了(我知道,這是相當難以閱讀。

UPDATE tableA a 
    JOIN tableB b 
    ON a.a_id = b.a_id 
    JOIN tableC c 
    ON b.b_id = c.b_id 
    SET b.val = a.val+c.val 
WHERE a.val > 10 
    AND c.val > 10; 

sql fiddle

+1

該語法不起作用。您必須刪除FROM部分並將SET部分移到JOIN後面。 – draca

+0

你是對的,我已經改變了它的作品。 –