Oracle 11g 中的限制子句

Posted

技术标签:

【中文标题】Oracle 11g 中的限制子句【英文标题】:Limit Clause in Oracle 11g 【发布时间】:2020-01-23 12:18:49 【问题描述】:

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

我正在使用 Oracle 11g 速成版并尝试了许多不同的答案,但都失败了。不知道为什么oracle的SQL里没有limit子句

这是它在 MYSQL 中的样子:

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

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

我从 *** 获得了解决方案:

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

但它给出了以下错误:

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

谁能给我一些简单的解决方案。提前致谢。

【问题讨论】:

使用ROWNUM伪列?如果我没记错的话,我相信 FETCH 是 Oracle 12c+... .. 在值相等的情况下怎么办?理想情况下,分页/批处理/限制需要确定性排序.. 其实我想从员工表中取出第二高的薪水。 为什么不升级到现代 Oracle 版本?不再支持 Oracle 11 @RaymondNijland:这可能是可移植的,但速度会非常慢。 【参考方案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)。

【讨论】:

所以我不能像在 MySQL 中那样设置偏移量? @Rehan:用seqnum >= ...替换偏移量 select * from emp order by sal desc limit 1,1 此查询返回员工的第二高薪水。 oracle应该怎么写? c.* 是什么意思? @Rehan 。 . .表示从表别名c所代表的表、视图或子查询中选择所有列。【参考方案2】:

这就是最终对我有用的东西:

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

【讨论】:

以上是关于Oracle 11g 中的限制子句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Fetch(限制行数)子句

Oracle Fetch(限制行数)子句

Oracle 11g PL/SQL Diana 节点数限制

Informix:IN 子句中的项目数量限制?

IN子句中的Spark sql限制

ORACLE 11G 中的 WITH 子句使用 UNION ALL