MySQL 中的内部联接 SELECT
INNER JOIN SELECT in MySQL
我有一个 SQL 语句在 SQL 服务器中有效但在 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 - You have an error in your SQL syntax; 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
当使用 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
MySQL 中多 table 更新的语法不同于 SQL 服务器。
您可以使用这样的语法:
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
并在 WHERE
子句之前添加一个 SET
子句。
我有一个 SQL 语句在 SQL 服务器中有效但在 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 - You have an error in your SQL syntax; 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
当使用 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
MySQL 中多 table 更新的语法不同于 SQL 服务器。
您可以使用这样的语法:
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
并在 WHERE
子句之前添加一个 SET
子句。