【问题标题】:SELECT Statement returns ORA-00933: SQL command not properly endedSELECT 语句返回 ORA-00933: SQL 命令未正确结束
【发布时间】:2019-10-11 16:21:06
【问题描述】:

我有以下 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 命令未正确结束

我做错了什么?

【问题讨论】:

  • 您可以在 livesql.oracle.com 在线使用最新版本的 oracle db - 您的查询将在那里“工作”

标签: sql oracle


【解决方案1】:

错误消息表明您使用的版本低于 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

【讨论】:

    【解决方案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 都被声明为 numeric。不要混合类型!单引号不仅没有必要,而且具有误导性(尽管在这种情况下无害):

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

    【讨论】:

    • 在 RANK() 上的出色表现!我希望他们采纳您的建议并在作业中获得 A。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2012-05-29
    • 2010-09-09
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多