我有以下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命令未正确结束
我在做什么错?
答案 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
答案 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');
id
和Salary
都声明为数字。不要混合类型!单引号不仅是不必要的,而且具有误导性(尽管在这种情况下不是有害的):
insert into Employee (Id, Salary)
values (1, 100);