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

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

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

【问题讨论】:

    标签: sql oracle 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 ... 之后的子查询中添加附加条件(我建议放入子查询中)
    猜你喜欢
    • 2020-04-24
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多