为啥我的最高薪水查询有语法错误?

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,')')?总的来说,您的SELECTSELECT 语句的语法关系不大。 要回答您提出的原始问题,“编写 SQL 查询以从 Employee 表中获取第 n 个最高薪水。”,我认为您可以在 Salary 列中选择最高 (MAX) 值并且 Id 小于或等于第 n 个值。谁不是更简单的解决方案? Gordon Linoff 嗨,这是返回表“getNthHighestSalary(2)”的标题 【参考方案1】:

您不能以这种方式初始化@i 变量。通常,您可以在使用这种SET 语句的查询之前初始化它,或者在查询中初始化它,例如: .... FROM Employee, (@i := 0) AS init ....

此外,您无法计算结果字段的别名,或实际的任何别名;这不是您当前错误的来源,而且您的函数无论如何都不会返回该别名;但我认为值得注意。 我很惊讶它实际上并没有首先出错。

【讨论】:

Uueerdo 谢谢。我应该在哪里更改我的查询?我只想创建一个新索引,按降序列出工资。

以上是关于为啥我的最高薪水查询有语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥mybatis在执行查询时会报SQL语法错误?

为啥在 MySQL 查询中添加 '*' 会导致语法错误?

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误

我的 Outer Apply 语句中有语法错误,我不明白为啥[重复]

为啥总是在我的代码中显示语法错误?

为啥“WITH”子句在 Informix 上会出现语法错误?