Оператор SELECT возвращает ORA-00933: команда SQL неправильно завершена - PullRequest
1 голос
/ 25 мая 2019

У меня есть следующая схема 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 ]

2 голосов
/ 25 мая 2019

Три очка. Во-первых, в более ранних версиях 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);
2 голосов
/ 25 мая 2019

Сообщение об ошибке указывает, что вы используете версию ниже, чем 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...