我想更新具有多个连接的语句中的表。虽然我知道连接的顺序并不重要(除非你使用的是优化器提示),我命令它们以某种方式最直观地阅读。但是,这导致我想要更新的表不是我开始使用的表,并且我在更新它时遇到问题。
我想做的一个虚拟例子是:
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 Too中使用!
答案 0 :(得分:88)
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;
MySQL的语法中没有FROM子句。
使用JOIN更新不是标准SQL,MySQL和Microsoft SQL Server都已经实现了自己的想法作为标准语法的扩展。
答案 1 :(得分: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;
答案 2 :(得分: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>
)
答案 3 :(得分:0)
我们可以在这种情况下使用的另一种正确构造:
UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition
以上示例摘自:MySQL UPDATE JOIN。
到达MySQL 8.0 Reference Manual的过程中,我们会找到对multiple-table UPDATE syntax的描述:
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET assignment_list
[WHERE where_condition]
table_references 子句列出了
join
中涉及的表。
因此多表MySQL的语法不支持FROM
,ORDER BY
或LIMIT
子句,而不是单表语法。