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 子句。