MySQL中的INNER JOIN SELECT

时间:2015-06-14 02:05:12

标签: mysql sql-update inner-join

我有一个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附近

2 个答案:

答案 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_multiplesccs_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 子句。