[英]Subquery in FROM clause fails in MySQL
當嘗試在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'
我會很感激為什么發生這種情況的任何線索。 請注意 ,我最感興趣的不是解決此查詢的方法或其他方法,而是了解嵌套查詢失敗的原因。
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
你可以嘗試如下
SELECT
(
select SUM(tot) as total from
(
SELECT
(
SELECT SUM(OD.quantityOrdered * OD.priceEach)
FROM orderdetails OD
WHERE OD.orderNumber = O.orderNumber
) AS tot,customerNumber
FROM orders O
) as ord
WHERE ord.customerNumber = C.customerNumber
) AS total
FROM customers AS C;
您的客戶表不在您在條件WHERE O.customerNumber = C.customerNumber
使用的子查詢范圍內,因此我WHERE O.customerNumber = C.customerNumber
了別名,然后在以后的級別中,我使用了客戶表具有范圍的相同條件
在第二種情況下,您具有相關的子查詢。 但是,相關子句有兩個層次 。
即使嵌套多個級別,許多數據庫仍然可以識別c
。 但是,MySQL(和Oracle,我認為是MS Access)是一個將關聯子句限制在一個層次上的數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.