mysql - 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'
我会感谢任何有关为什么会发生这种情况的线索。请注意,我最感兴趣的不是解决方法或其他实现此查询的方法,而是了解嵌套查询失败的原因。
解决方案
不在 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
推荐阅读
- angular - 在 mat-sidenav 组件的“关闭”事件中更改状态时不会触发角度动画?
- javascript - 根据一个匹配从一个json对象返回两个参数
- c# - 使用 Automapper 映射自引用关系
- cakephp - CakePHP validateUnique 未找到
- clojure - SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”路径已设置
- python - 如何使用数组或 csv 中的 timpoints 将音频文件拆分为多个 wav 文件?
- django - docker-compose 卷不会保留数据
- c++ - QtGraphicsScene 中的 mouseMoveTracking
- google-chrome - chrome print to pdf 不适用于文件
- function - VHDL 类型的变量与函数调用的类型不兼容