当前位置: 首页 > 面试题库 >

订购后如何限制Oracle查询返回的行数?

闻鹤龄
2023-03-14
问题内容

有没有一种方法可以使Oracle查询的行为类似于包含MySQLlimit子句的行为?

在MySQL中,我可以这样做:

select * 
from sometable
order by name
limit 20,10

以获得第21到30行(跳过前20行,给出下10行)。这些行是在后面选择的order by,因此它实际上按字母顺序从第20个名称开始。

在Oracle中,人们唯一提到的是rownum伪列,但是它在之前 被评估order by,这意味着:

select * 
from sometable
where rownum <= 10
order by name

返回一个随机的十行,按名称排序,这通常不是我想要的。它还不允许指定偏移量。


问题答案:

从Oracle 12C R1(12.1)开始,那里是一个行限制性条款。它不使用熟悉的LIMIT语法,但是可以通过更多选项更好地完成这项工作。您可以在此处找到完整的语法。(还可以在此答案中阅读有关Oracle内部如何工作的更多信息)。

要回答原始问题,以下是查询:

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

设置

CREATE TABLE rownum_order_test (
  val  NUMBER
);

INSERT ALL
  INTO rownum_order_test
SELECT level
FROM   dual
CONNECT BY level <= 10;

COMMIT;

table上有什么?

SELECT val
FROM   rownum_order_test
ORDER BY val;

       VAL
----------
         1
         1
         2
         2
         3
         3
         4
         4
         5
         5
         6
         6
         7
         7
         8
         8
         9
         9
        10
        10

20 rows selected.

获取第一N行

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

       VAL
----------
        10
        10
         9
         9
         8

5 rows selected.

获得第一N行中,如果N日行有关系,让所有的束缚行

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS WITH TIES;

       VAL
----------
        10
        10
         9
         9
         8
         8

6 rows selected.

x行的前%

SELECT val
FROM   rownum_order_test
ORDER BY val
FETCH FIRST 20 PERCENT ROWS ONLY;

       VAL
----------
         1
         1
         2
         2

4 rows selected.

使用偏移量,对分页非常有用

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.

您可以将偏移量与百分比结合起来

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.


 类似资料:
  • 问题内容: 我负责处理的应用程序之一是每隔x秒检查一次Oracle DB表,以查看是否有新数据要处理(其他实时应用程序正在填充该数据)。 我们新的客户业务流程迫使我们的实时性在同一时间(比如说10000)同时每天填充几次记录来填充该表。下次我的应用程序检查是否有任何要处理的内容时,遇到10 000条记录并尝试对其进行处理。 它的设计不是很好,而且扩展性还不够好。快速解决方案是限制该应用程序从Ora

  • 问题内容: 如何计算MySQL查询返回的行数? 问题答案: 获取查询结果中的总行数… 您可以仅迭代结果并计数。您没有说使用什么语言或客户端库,但是API确实提供了mysql_num_rows函数,该函数可以告诉您结果中的行数。 例如,这在PHP中作为mysqli_num_rows函数公开。编辑问题以提及您正在使用PHP时,这是一个使用mysqli函数的简单示例: 获取符合某些条件的行数… 只需使用

  • 我试图通过使用以下针对oracle数据库的SQL查询,将创建/修改的行恢复一小时 从文件内容中选择*行 我试图实现同样的在我们的java应用程序中使用以下hiberNate命名查询 @namedQuery(name="FileContent.findsent", query="从文件夹c中选择idc.rowmoddt 但它没有给出预期的数据。 请帮我做这个。 谢谢

  • 问题内容: 我希望在编写以下查询时基于表’MasterScrip’的’totalTradedVolume’获取前10个结果: 我得到以下异常: 我的jpa查询有问题。有人可以纠正我吗? 问题答案: 在JPA中不被认可。您可以改用以下方法:

  • 问题内容: 我从查询中返回了要按最佳匹配顺序进行排序的结果列表。我会尽我所能地保持清晰,但是如果某些事情还不够清晰,请告诉我,我将尝试使其更加清晰。 用户已经输入了名为的设置列表。有了这些,我正在寻找产品。一切顺利,直到他应该挑选出最佳比赛。 有几个字段,例如。 我要订购。例如,他需要先订购带有的产品,然后再订购。您可以使用来做到这一点,但是我希望不安静匹配的结果也只显示在列表的底部。因此,基本上