[英]INNER JOIN SELECT in MySQL
I have an SQL statement that works in SQL Server but fails in MySQL... shouldn't this work in MySQL? 我有一条在SQL Server中可用但在MySQL中失败的SQL语句...在MySQL中不行吗?
UPDATE T2
SET TotalAmount = T1.SumAmount
FROM ccs_multiples as T2
INNER JOIN (SELECT SUM(Amount) as SumAmount, SerialNumber
FROM ccs_multiples_items
GROUP BY SerialNumber) as T1
ON T2.SerialNumber = T1.SerialNumber
Error: 错误:
#1064 - You have an error in your SQL syntax;
#1064-您的SQL语法有误; check the manual that corresponds to your MySQL server version for the right syntax to use near
FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria
at line 3检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在
FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria
附近使用FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria
在第3行)
When updating with a JOIN
, instead of doing a JOIN
, you can specify multiple tables in the update, ie. 使用
JOIN
更新时,您可以在更新中指定多个表,而不是执行JOIN
。
UPDATE table1 t1, table2 t2
and then specify what would typically be your JOIN
condition, instead as part of your WHERE
condition, like 然后指定通常是您的
JOIN
条件,而不是WHERE
条件的一部分,例如
WHERE t1.someCol=t2.someOtherCol
So instead of a join, you could write your query like this 因此,您可以像这样编写查询,而不是联接
UPDATE
ccs_multiples T2,
(SELECT
SUM(Amount) AS SumAmount,
SerialNumber
FROM
ccs_multiples_items
GROUP BY SerialNumber) T1
SET
T2.TotalAmount = T1.SumAmount
WHERE T2.SerialNumber = T1.SerialNumber
The syntax for a multi-table update in MySQL is different than SQL Server. MySQL中多表更新的语法与SQL Server不同。
You can use syntax like this: 您可以使用如下语法:
UPDATE ccs_multiples T2
JOIN ( SELECT SUM(i.Amount) AS SumAmount
, i.SerialNumber
FROM ccs_multiples_items i
GROUP BY i.SerialNumber
) T1
ON T2.SerialNumber = T1.SerialNumber
SET T2.TotalAmount = T1.SumAmount
NOTES: 笔记:
In MySQL, the INNER
keyword is optional; 在MySQL中,
INNER
关键字是可选的; omitting it has no effect on the statement. 省略它对语句没有影响。
But, what would you want to do with rows in ccs_multiples
that don't have any corresponding rows in ccs_multiples_items
. 但是,您要如何处理
ccs_multiples
中没有任何对应行的ccs_multiples_items
行。 To set the TotalAmount
column to zero for those rows, you could use an outer join: 要将这些行的
TotalAmount
列设置为零,可以使用外部TotalAmount
:
UPDATE ccs_multiples T2
LEFT
JOIN ( SELECT SUM(i.Amount) AS SumAmount
, i.SerialNumber
FROM ccs_multiples_items i
GROUP BY i.SerialNumber
) T1
ON T2.SerialNumber = T1.SerialNumber
SET T2.TotalAmount = IFNULL(T1.SumAmount,0)
One thing to note about the MySQL syntax, we can (usually) convert a SELECT
statement into an UPDATE
statement. 关于MySQL语法要注意的一件事,我们可以(通常)将
SELECT
语句转换为UPDATE
语句。 I usually start with a SELECT
to test the predicates and the expressions. 我通常以
SELECT
开头来测试谓词和表达式。 For example: 例如:
SELECT T2.SerialNumber
, T2.TotalAmount AS existing_TotalAmount
, T1.SumAmount
, IFNULL(T1.SumAmount,0) AS new_TotalAmount
FROM ccs_multiples T2
LEFT
JOIN ( SELECT SUM(i.Amount) AS SumAmount
, i.SerialNumber
FROM ccs_multiples_items i
GROUP BY i.SerialNumber
) T1
ON T2.SerialNumber = T1.SerialNumber
We can test that SELECT, and verify that the expressions are working correctly. 我们可以测试SELECT,并验证表达式是否正常工作。 To convert that into an UPDATE statement, we just remove the
SELECT ... FROM
from the beginning of the statement, and replace it with UPDATE
and add a SET
clause before the WHERE
clause. 要将其转换为UPDATE语句,我们只需从语句开头删除
SELECT ... FROM
,然后将其替换为UPDATE
并在WHERE
子句之前添加SET
子句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.