2011-11-30 65 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

你是对的,我已经改变了它的作品。 –