我有一个SQL语句在SQL Server中有效但在MySQL中失败...这不应该在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
错误:
#1064 - 您的SQL语法出错;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在第3行
FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria
附近
答案 0 :(得分:1)
使用JOIN
进行更新时,您可以在更新中指定多个表,而不是JOIN
,即
UPDATE table1 t1, table2 t2
然后指定通常属于JOIN
条件的内容,而不是WHERE
条件的一部分,例如
WHERE t1.someCol=t2.someOtherCol
因此,您可以像这样写
来代替连接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
答案 1 :(得分:0)
MySQL中多表更新的语法与SQL Server不同。
您可以使用以下语法:
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
注意:
在MySQL中,INNER
关键字是可选的;省略它对声明没有影响。
但是,对于ccs_multiples
中ccs_multiples_items
中没有任何相应行的行,您想要做什么?要将这些行的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)
关于MySQL语法的一点需要注意,我们可以(通常)将SELECT
语句转换为UPDATE
语句。我通常以SELECT
开头来测试谓词和表达式。例如:
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
我们可以测试SELECT,并验证表达式是否正常工作。要将其转换为UPDATE语句,我们只需从语句开头删除 SELECT ... FROM
,并将其替换为 UPDATE
并添加SET
子句之前的 WHERE
子句。