【问题标题】:INNER JOIN SELECT in MySQLMySQL中的INNER JOIN SELECT
【发布时间】:2015-06-14 02:05:12
【问题描述】:

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

【问题讨论】:

  • 请描述“失败”。有任何错误信息吗?意外行为?
  • MySQL 说: #1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria”附近使用正确的语法

标签: mysql sql-update inner-join


【解决方案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 

【讨论】:

  • 你是在暗示 MySQL 不支持INNER JOIN 语法吗?
  • @PM77-1 我没有暗示什么。我就是这样做的。如果您有保留内部连接的解决方案,请告知
  • @Mark 请详细说明
  • 这似乎有效...UPDATE 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
  • @chiliNUT:这个解决方案确实有一个内部连接。它只是用用于连接操作的老式逗号语法而不是 JOIN 关键字来表示。使用JOIN 关键字,我们还可以选择将连接谓词从WHERE 子句重新定位到ON 子句。 (说“这个解决方案没有”内连接是不准确的。这个解决方案使用逗号代替JOIN关键字,但它仍然是一个内连接操作。)
【解决方案2】:

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 并添加 @ WHERE 子句之前的 987654333@ 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多