SELECT语句返回ORA-00933:SQL命令未正确结束

时间:2019-05-25 08:44:14

标签: sql oracle

我有以下SQL模式:

Create table Employee (Id int, Salary int);
Truncate table Employee;

insert into Employee (Id, Salary) values ('1', '100');
insert into Employee (Id, Salary) values ('2', '200');
insert into Employee (Id, Salary) values ('3', '300');

并对数据库执行以下查询:

SELECT Salary as SecondHighestSalary
FROM Employee
ORDER BY Salary
    OFFSET 1 ROWS FETCH FIRST 1 ROWS ONLY;

它在Oracle XE 18上有效,但在leetcode.com(我不知道他们运行的是哪个版本的Oracle)上,它将返回以下错误:

  

ORA-00933:SQL命令未正确结束

我在做什么错?

2 个答案:

答案 0 :(得分:2)

错误消息表明您使用的版本低于Oracle 12c(很可能是Oracle 11g XE)。

OFFSET FETCH在版本12c中引入。您可以执行以下命令轻松检查它:

select * from V$VERSION;

SELECT Salary as SecondHighestSalary
FROM Employee
ORDER BY Salary
    OFFSET 1 ROWS FETCH FIRST 1 ROWS ONLY;
-- ORA-00933: SQL command not properly ended

db<>fiddle

答案 1 :(得分:2)

三点。首先,在早期版本的Oracle中,您可以使用窗口函数:

SELECT Salary as SecondHighestSalary
FROM (SELECT e.*,
             ROW_NUMBER() OVER (ORDER BY Salary DESC) as seqnum
      FROM Employee e
     ) e
WHERE seqnum = 2;

第二,这不会返回“第二高薪”(用非常合理的措词解释),因为最高薪水可以捆绑在一起。如果您实际上想要第二高的薪水(而不是第二名人员的薪水),请使用RANK()而不是ROW_NUMBER()

第三,您有以下插入语句:

insert into Employee (Id, Salary) values ('1', '100');

idSalary都声明为数字。不要混合类型!单引号不仅是不必要的,而且具有误导性(尽管在这种情况下不是有害的):

insert into Employee (Id, Salary)
    values (1, 100);