在Oracle的SQL查询中获取固定数量的行[重复]

Posted

技术标签:

【中文标题】在Oracle的SQL查询中获取固定数量的行[重复]【英文标题】:Fetch a fixed number of rows in SQL query in Oracle [duplicate] 【发布时间】:2014-09-10 11:04:02 【问题描述】:

请帮我在 Oracle 数据库中编写一个 SQL 查询。有一个名为 tbl 的表,它有 12 行。我想先选择前 4 行,然后选择下 4 行和最后 4 行。

任何人都可以告诉我如何在 Informix 中执行此操作。

【问题讨论】:

【参考方案1】:

编辑:现在应该用 3 级选择修复:

select * from (
  select q1.*, rownum as rn from (   --get correct rownum 
      select * from tbl order by column --get correct order
  ) q1
) q2
 where q2.rn between 1 and 4; -- filter

第一部分。

第二部分和第三部分:

 where q2.rn between 5 and 8
 where q2.rn between 9 and 12

【讨论】:

在您的情况下,rownum between 5 and 8rownum between 9 and 12 将不起作用,因为大于正整数的值始终为 false,如 Oracle document 中所述 @vasja- yammy 是对的。它不适用于第二部分和第三部分。 ROWNUM 不能这样工作。 ROWNUM 是一个伪列,它只有在 1 时才会进一步增加到 2。所以,当你说 rownum 在 5 和 8 之间时,ROWNUM 甚至不会增加,所以它永远不会返回任何行。它只会以这种方式工作:select * from(select rownum rn, val from order_test order by val) where rn between 5 and 8 @vasja- 是的,它也在工作 您可以简单地使用我在上面评论中发布的查询:-)【参考方案2】:

除非您明确指定 ORDER BY 然后选择所需的行,否则没有任何内容称为第一行、最后一行、“n”行。

Top-n Row Limiting 功能在病房Oracle 12c

SQL> select * from 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.

前 4 行:

SQL> SELECT val
  2  FROM   order_test
  3  ORDER BY VAL
  4  FETCH FIRST 4 ROWS ONLY;

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

接下来的 4 行(查看偏移量)

SQL> SELECT val
  2  FROM   order_test
  3  ORDER BY VAL
  4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

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

最后,接下来的 4 行,OFFSET 8 行:

SQL> SELECT val
  2  FROM   order_test
  3  ORDER BY VAL
  4  OFFSET 8 ROWS FETCH NEXT 4 ROWS ONLY;

       VAL
----------
         5
         5
         6
         6

【讨论】:

很高兴知道 12c 中有这样的功能! mysql 中有,现在 Oracle 有自己的 row Limiting Top N 查询功能。不用再担心和困惑 ROWNUM :-)【参考方案3】:

你可以使用rownum:

select * from (select t.*, rownum rn from tbl t) where rn between 1 and 4;
/
select * from (select t.*, rownum rn from tbl t) where rn between 5 and 8;
/
select * from (select t.*, rownum rn from tbl t) where rn between 9 and 12;
/

如果您使用order by 子句,请使用row_number() (documentation)

select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 1 and 4;
/
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 5 and 8;
/
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 9 and 12;
/

【讨论】:

@yammy- 谢谢,它对我有用。你能告诉我如何在上面的查询中放置 where 条件。 @AmitRaj 你的意思是where 用于结果过滤?您可以在where rn... 之后或在from tbl t where ... 之后的子查询中添加附加条件(我建议放入子查询中)

以上是关于在Oracle的SQL查询中获取固定数量的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

获取联系人在一分钟内有 20 个活动的行 - SQL 查询 [重复]

oracle 分页查询数据重复问题

如何编写oracle SQL查询以特定顺序获取匹配和不匹配的行对(基于键列)

SQL Oracle 查询数据,汇总数据 oracle数据查询

MySql怎么查询重复的数据

在 MySQL 中仅检索固定数量的行