如何在MySQL的WHERE子句中使用子查询表别名

问题描述 投票:0回答:1
SELECT invoice_id, sum_amount
FROM (SELECT invoice_id, SUM(amount) AS sum_amount
      FROM invoice
      GROUP BY invoice_id) AS TEMP_TABLE
WHERE sum_amount in (SELECT MAX(sum_amount) 
                     FROM TEMP_TABLE); 

[当我尝试使用TEMP_TABLE时,发生错误,并且说TEMP_TABLE不存在。为什么不起作用?我认为执行顺序是“ FROM”然后是“ WHERE”,此时已创建表别名。

mysql sql
1个回答
2
投票

您无法在子查询中为先前计算的别名计算最大值,也可以将查询重写为

SELECT a.invoice_id, SUM(a.amount) AS sum_amount,
c.max_amount
FROM invoice AS a
CROSS JOIN (
      SELECT MAX(sum_amount) max_amount FROM(
          SELECT invoice_id, SUM(amount) AS sum_amount
          FROM invoice
          GROUP BY invoice_id
      ) b
) c
GROUP BY a.invoice_id
HAVING sum_amount = c.max_amount

我创建了一个示例演示以进行测试

样本数据

INSERT INTO invoice
    (`invoice_id`, `amount`)
VALUES
    (1, 10),
    (2, 5),
    (2, 5),
    (3, 1),
    (4, 2);

在上面的查询中,您可以看到发票的最大金额为10,因此应返回invoice_id => 1,2 1的金额为10,而invoice_id的两个条目=> 2(5 + 5 = 10)也是10,结果集样本输出中不应包含3和4]

invoice_id  sum_amount  max_amount
1           10          10
2           10          10

DEMO

© www.soinside.com 2019 - 2024. All rights reserved.