为什么在SELECT中对子查询调用MAX失败



有人能帮我回答为什么我的查询返回语法错误吗?我正在处理与此相关的Hackerrank问题。

这是我写的代码:

SELECT MAX(SELECT e1.salary * e1.months FROM Employee as e1) as max_tot_earnings, COUNT(e.employee_id)
FROM Employee as e
WHERE e.salary * e.months = max_tot_earnings

我得到以下语法错误:

第1行错误1064(42000(:您的SQL语法有错误;查看与MySQL服务器版本对应的手册在SELECT e1.salary*e1.months FROM Employee附近使用的正确语法作为e1(作为max_to_earning,COUNT(e.e'在第1行

我知道子查询没有语法错误。它单独运行时运行得很好。我也能够解决这个问题,所以这个问题的目的是试图弄清楚发生了什么。我能够通过下面的查询解决这个问题:

SELECT (SELECT e1.salary * e1.months as tot_earnings FROM Employee as e1 ORDER BY tot_earnings DESC LIMIT 1) as max_tot_earnings, COUNT(e.employee_id)
FROM Employee as e
GROUP BY e.salary, e.months
HAVING e.salary * e.months = max_tot_earnings

我在这里找到了一些关于使用SELECT MAX(SELECT…(的问题,但我没有找到上面两个问题的答案。问题一、二和三。

总之,我有两个主要问题:

  1. 为什么SELECT MAX(SELECT…(方法返回语法错误?我以前在HAVING中使用过MAX(SELECT…(语句,所以我很困惑。SELECT中是否不允许使用带有子查询的聚合函数
  2. 在我在线搜索#1的答案时,我看到了在FROM语句中移动子查询的建议。这是否比在SELECT语句中包含子查询更可取(如上面所示的最终解决方案(

正确的语法是:

SELECT (SELECT MAX(e1.salary * e1.months) FROM Employee as e1) as max_tot_earnings,
COUNT(e.employee_id)
FROM Employee as e
WHERE e.salary * e.months = max_tot_earnings;

或者更简单地说:

SELECT (e.salary * e.months) as max_tot_earnings, COUNT(*)
FROM Employee
GROUP BY max_tot_earnings
ORDER BY max_tot_earnings DESC
LIMIT 1;

您的查询不起作用,原因如下:

  1. 子查询需要自己的一组括号。函数调用也是如此。因此MAX( (SELECT . . . ) )至少满足括号的要求
  2. MAX()函数接受一个参数,该参数是列引用、常量或计算结果为标量的表达式。您的函数调用不能做到这一点
  3. MAX()根本不允许子查询,甚至不允许标量子查询

最新更新