【问题标题】:Using rownum with the combination of between keyword使用 rownum 和 between 关键字的组合
【发布时间】:2011-09-06 20:12:09
【问题描述】:

我已经看到这个 Oracle SQL 查询使用 rownum 和 between 关键字的组合。

select *
from
( select rownum rnum, a.*
from (your_query) a
where rownum <= :M )
where rnum >= :N;

为了从“您的查询”中获取行 n 到 m。

我想试试,谁能告诉我如何从 Emp 表中获取数据以从 4 到 8 条记录中获取记录

select *
from
( select rownum rnum, a.*
from (select * from emp) a
where rownum <= 4 )
where rnum >= 8;

但这不起作用,谁能告诉我原因。

非常感谢。

【问题讨论】:

  • 交换你的 rownum 值...(编辑:对角蝙蝠侠首先到达那里 :-))

标签: oracle


【解决方案1】:

这是因为您将查询限制为 =8 的记录时,只有 4 条记录可供查看....

反转数字,您应该会看到结果:

select *
from
( select rownum rnum, a.*
from (select * from emp) a
where rownum <= 8 )
where rnum >= 4;

【讨论】:

    【解决方案2】:

    如果我不得不猜测,我会说你没有看到你所期望的原因(除了让运算符倒退,正如@diagonalbatman 所指出的那样)是你没有告诉数据库什么订购您想要的行。您实际上是在告诉数据库返回任何 5 行。您甚至无法确定该查询是否总是返回相同的五行。任何时候获得这样的子集时,都应该在最里面的查询中使用 order by 子句,以便在发出 rownum 值之前应用排序:

    SELECT *
    FROM   (SELECT ROWNUM rnum, a.*
            FROM   (SELECT   *
                    FROM     emp
                    ORDER BY emp_id) a
            WHERE  ROWNUM <= 8)
    WHERE  rnum >= 4;
    

    【讨论】:

      【解决方案3】:

      当您在内部语句中查询整个数据时(如果您有大量数据,那就不是好主意!)您也可以使用 BETWEEN 关键字。

      SELECT *
        FROM 
             (SELECT rownum AS rnum,
                     a.* 
                FROM EMP) a
       WHERE rnum BETWEEN 4 AND 8;
      

      【讨论】:

      • 对,只是保存一些字符 ;-)
      • 不仅如此——它也更有效率
      • @diagonalbatman:这个版本效率不高。您的解决方案可以使用 count stopkey 在应用下限之前仅获取低于上限的行。在应用过滤器之前,此版本将获得整个表的 rownum。唯一的例外是,如果最里面的查询是在未索引的列上排序的,在这种情况下,两个查询的性能大致相同,因为无论如何它们都必须首先对整个表进行排序。
      猜你喜欢
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多