mysql - FROM 子句中的子查询在 MySQL 中失败

标签 mysql sql sql-server

尝试在 FROM 子句中运行嵌套子查询时,我偶然发现了 MySQL (v.8) 的一个奇怪行为。我正在使用的示例数据库的(相关部分)架构如下:

enter image description here

以下两个查询在 SQL Server 上运行相同:

SELECT SUM(tot) as total
 FROM (
     SELECT 
        SUM(OD.quantityOrdered * OD.priceEach) as tot,
        C.customerNumber
     FROM customers C
     INNER JOIN orders O ON C.customerNumber = O.customerNumber
     INNER JOIN orderdetails OD ON O.orderNumber = OD.orderNumber
     GROUP BY O.orderNumber, C.customerNumber
) AS CO
GROUP BY CO.customerNumber;

SELECT 
  (
    SELECT SUM(tot) as total
    FROM 
        (
            SELECT 
                (
                    SELECT  SUM(OD.quantityOrdered * OD.priceEach)
                    FROM orderdetails OD 
                    WHERE OD.orderNumber = O.orderNumber
                ) AS tot
            FROM orders O
            WHERE O.customerNumber = C.customerNumber
        ) AS ORD
  ) AS total
FROM customers AS C;

然而,在 MySQL 上,第一个运行良好,而第二个导致错误:

Error Code: 1054. Unknown column 'C.customerNumber' in 'where clause'

我将不胜感激关于为什么会发生这种情况的任何线索。 请注意,我最感兴趣的不是解决方法或其他实现此查询的方法,而是了解嵌套查询失败的原因。

最佳答案

C 表别名不在 suquery 范围内
尝试使用连接重构查询

例如

select  c.customerNumber,  t.my_tot 
FROM customers AS C
INNER JOIN (

  SELECT  O.customerNumber, SUM(OD.quantityOrdered * OD.priceEach) my_tot
  FROM orderdetails OD 
  INNER JOIN orders O ON  OD.orderNumber = O.orderNumber
  GROUP BY O.customerNumber
) t on t.customerNumber = c.customerNumber

select  t.my_tot 
FROM customers AS C
INNER JOIN (

  SELECT  O.customerNumber, SUM(OD.quantityOrdered * OD.priceEach) my_tot
  FROM orderdetails OD 
  INNER JOIN orders O ON  OD.orderNumber = O.orderNumber
  GROUP BY O.customerNumber
) t on t.customerNumber = c.customerNumber

关于mysql - FROM 子句中的子查询在 MySQL 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53187525/

相关文章:

java - 我正在创建一个简单的 JDBC Java 应用程序,获取类未找到异常

mysql - 分组和有限查询的随机顺序

java - 如何在jOOQ中配置乐观锁?

sql-server - SSRS : Display image from varbinary column in the database

mysql - 在mySql中创建一个带参数的过程

php - 从 mysql 更新到 mysqli newbie

.net - 如何有效地对数据库中的继承进行建模?

SQL 默默地将 int 转换为 varchar,但在遇到 varchar 时抛出错误?

mysql - 按相同字段值对用户进行分组

sql - SQL Compact 4 是否适合多用户 ASP.NET Web 应用程序?