简体   繁体   English

在MySQL中进行内部联接选择

[英]INNER JOIN SELECT in MySQL

I have an SQL statement that works in SQL Server but fails in MySQL... shouldn't this work in MySQL? 我有一条在SQL Server中可用但在MySQL中失败的SQL语句...在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

Error: 错误:

#1064 - You have an error in your SQL syntax; #1064-您的SQL语法有误; 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 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria附近使用FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria在第3行)

When updating with a JOIN , instead of doing a JOIN , you can specify multiple tables in the update, ie. 使用JOIN更新时,您可以在更新中指定多个表,而不是执行JOIN

UPDATE table1 t1, table2 t2

and then specify what would typically be your JOIN condition, instead as part of your WHERE condition, like 然后指定通常是您的JOIN条件,而不是WHERE条件的一部分,例如

WHERE t1.someCol=t2.someOtherCol

So instead of a join, you could write your query like this 因此,您可以像这样编写查询,而不是联接

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 

The syntax for a multi-table update in MySQL is different than SQL Server. MySQL中多表更新的语法与SQL Server不同。

You can use syntax like this: 您可以使用如下语法:

  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

NOTES: 笔记:

In MySQL, the INNER keyword is optional; 在MySQL中, INNER关键字是可选的; omitting it has no effect on the statement. 省略它对语句没有影响。

But, what would you want to do with rows in ccs_multiples that don't have any corresponding rows in ccs_multiples_items . 但是,您要如何处理ccs_multiples中没有任何对应行的ccs_multiples_items行。 To set the TotalAmount column to zero for those rows, you could use an outer join: 要将这些行的TotalAmount列设置为零,可以使用外部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)

One thing to note about the MySQL syntax, we can (usually) convert a SELECT statement into an UPDATE statement. 关于MySQL语法要注意的一件事,我们可以(通常)将SELECT语句转换为UPDATE语句。 I usually start with a SELECT to test the predicates and the expressions. 我通常以SELECT开头来测试谓词和表达式。 For example: 例如:

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

We can test that SELECT, and verify that the expressions are working correctly. 我们可以测试SELECT,并验证表达式是否正常工作。 To convert that into an UPDATE statement, we just remove the SELECT ... FROM from the beginning of the statement, and replace it with UPDATE and add a SET clause before the WHERE clause. 要将其转换为UPDATE语句,我们只需从语句开头删除SELECT ... FROM ,然后将其替换为UPDATE并在WHERE子句之前添加SET子句。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM