首页 > 解决方案 > MySQL 中 FROM 子句中的子查询失败

问题描述

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

在此处输入图像描述

以下两个查询在 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'

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

标签: mysqlsqlsql-server

解决方案


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

例如

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

推荐阅读