Oracle 11g中的限制条款

时间:2019-09-23 12:16:47

标签: sql oracle

我是数据库新手,已经开始学习SQL。 我正在尝试将MySQL查询转换为可与oracle数据库一起使用。

我正在使用Oracle 11g Express Edition,并尝试了许多不同的答案,但失败了。我不知道为什么Oracle在其SQL中没有limit子句

这是MYSQL中的样子:

select *
from emp
order by sal desc
limit 1,1

我已经看到了很多关于如何在oracle中使用rownum转换限制的答案,但是找不到如何编写偏移量。

我从StackOverflow得到了一个解决方案:

select * from emp
order by sal  desc
OFFSET 1 ROW FETCH NEXT 1 ROW ONLY;

但出现以下错误:

  

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

任何人都可以建议我一些简单的解决方案。预先感谢。

2 个答案:

答案 0 :(得分:1)

在旧版本的Oracle中,您需要一个子查询:

select c.*
from (select c.*, row_number() over (order by c.points desc) as seqnum
      from customers c
     ) c
where seqnum = 2;

您将在外部查询中看到使用rownum的示例:

select c.*
from (select c.*
      from customers c
     ) c
where rownum = 2;

但是,这不起作用,因为rownum仅在将行放入结果集中时才递增。窗口函数是旧版本的Oracle中最简单的解决方案(新版本支持fetch / offset)。

答案 1 :(得分:0)

这是最终为我工作的东西:

SELECT *
FROM   (SELECT sal, rownum AS rnum
        FROM   (SELECT sal
                FROM   emp
                ORDER BY sal desc)
        WHERE rownum <= 2)
WHERE  rnum > 1;

其中1是偏移量

有关更多详细信息,请参见: How to add offset in a "select" query in Oracle 11g?

感谢Jeffrey Kemp和Lalit Kumar B