有人能帮我回答为什么我的查询返回语法错误吗?我正在处理与此相关的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…(的问题,但我没有找到上面两个问题的答案。问题一、二和三。
总之,我有两个主要问题:
- 为什么SELECT MAX(SELECT…(方法返回语法错误?我以前在HAVING中使用过MAX(SELECT…(语句,所以我很困惑。SELECT中是否不允许使用带有子查询的聚合函数
- 在我在线搜索#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;
您的查询不起作用,原因如下:
- 子查询需要自己的一组括号。函数调用也是如此。因此
MAX( (SELECT . . . ) )
至少满足括号的要求 MAX()
函数接受一个参数,该参数是列引用、常量或计算结果为标量的表达式。您的函数调用不能做到这一点MAX()
根本不允许子查询,甚至不允许标量子查询