为啥我的最高薪水查询有语法错误?
Posted
技术标签:
【中文标题】为啥我的最高薪水查询有语法错误?【英文标题】:Why does my query for highest salary has a syntax error?为什么我的最高薪水查询有语法错误? 【发布时间】:2018-11-12 20:18:16 【问题描述】:问题:
编写一个 SQL 查询,从 Employee 表中获取第 n 高的薪水。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如,给定上面的 Employee 表,n = 2 的第 n 个最高薪水是 200。如果没有第 n 个最高薪水,则查询应返回 null。
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
我的查询:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN(
SELECT NT.Salary as CONCAT('getNthHighestSalary','(',N,')')
FROM (SET @i := 0;
SELECT (@i := @i + 1) as Index, Id, Salary
FROM Employee
ORDER BY Salary DESC) AS NT
WHERE NT.Index = N);
END
错误:
Line 5: SyntaxError: near '('getNthHighestSalary','(',N,')')
FROM (SET @i := 0;
SELECT (@i :='
【问题讨论】:
你不能简单地通过连接一个字符串来使用函数名。您正在寻找使用动态 SQL。参考:dev.mysql.com/doc/refman/8.0/en/… 以下答案也可能有所帮助:***.com/a/53144473/2469308 和 ***.com/a/53147936/2469308 和 ***.com/a/53256183/2469308 这是什么:SELECT NT.Salary as CONCAT('getNthHighestSalary','(',N,')')
?总的来说,您的SELECT
与SELECT
语句的语法关系不大。
要回答您提出的原始问题,“编写 SQL 查询以从 Employee 表中获取第 n 个最高薪水。”,我认为您可以在 Salary 列中选择最高 (MAX) 值并且 Id 小于或等于第 n 个值。谁不是更简单的解决方案?
Gordon Linoff 嗨,这是返回表“getNthHighestSalary(2)”的标题
【参考方案1】:
您不能以这种方式初始化@i 变量。通常,您可以在使用这种SET
语句的查询之前初始化它,或者在查询中初始化它,例如:
.... FROM Employee, (@i := 0) AS init ....
此外,您无法计算结果字段的别名,或实际的任何别名;这不是您当前错误的来源,而且您的函数无论如何都不会返回该别名;但我认为值得注意。 我很惊讶它实际上并没有首先出错。
【讨论】:
Uueerdo 谢谢。我应该在哪里更改我的查询?我只想创建一个新索引,按降序列出工资。以上是关于为啥我的最高薪水查询有语法错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误