【问题标题】:Select Nth Row From A Table In Oracle从Oracle中的表中选择第N行
【发布时间】:2020-04-15 11:34:10
【问题描述】:

如何从 Oracle 中的表中选择第 N 行?

我试过了

SELECT PRICE FROM AAA_PRICING WHERE ROWNUM = 2

但这没有用。请帮忙!

【问题讨论】:

  • @zerkms, “没用”意味着结果集是空的
  • @Michael Pakhantsov:我现在没有神谕,但有什么理由吗?
  • @tobyodavies 但在 SQL 中很常见
  • 但一般不会出现在问题的其余部分中,这就是我所抱怨的,谢天谢地已经解决了。

标签: sql oracle


【解决方案1】:

基于经典答案:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:127412348064

select * 
  from ( select a.*, rownum rnum
           from ( YOUR_QUERY_GOES_HERE -- including the order by ) a
          where rownum <= N_ROWS )
 where rnum >= N_ROWS
/

【讨论】:

  • 那么将查询嵌套 3 深是从集合中选择单个结果的最佳方式吗?没有更简单的方法吗?
  • 不确定 Oracle 的最新版本,但直到 10g 为止都是这样做的。
  • 为什么不这样呢? select a.* from (select b.*, rownum rnum from yourquery AND rownum =N_ROWS ;
  • 嗨@davek,当我将查询粘贴到查询(YOUR_QUERY_GOES_HERE - 包括排序依据)时,我的列不明确是我的错误 SQL 错误:ORA-00918:列模糊定义 00918。00000 - “列定义不明确”
【解决方案2】:

不适用于 '='(将适用于 2,但不相等)

所以你可以

 SELECT Price from (SELECT PRICE, ROWNUM AS RN FROM AAA_PRICING) WHERE RN = 2

【讨论】:

  • @zerkms 请参阅 sjngm 的答案以获得解释。
  • 虽然这将返回正确的结果,但@davek 的回答更有效。
【解决方案3】:

解决这个问题的原因:

RowNum 是 Oracle 提供的伪列。它是在处理 SELECT 子句时生成的。由于 WHERE 子句在 SELECT 子句之前处理,RowNum 还没有合适的值。

人们可能会争论让 Oracle 在某种情况下抛出异常是否有意义,但因为 RowNum 仍然是一个伪列,所以在其中放置它仍然有效。

注意:不要将此与 RowId 混淆,这是完全不同的故事!

重要编辑:

请注意,我写的关于RowNum 的内容仅适用于=&gt;&gt;=IN () 和其他人。如果您检查,例如RowNum &lt; 10,你只有9条记录!?我不知道为什么会这样!

【讨论】:

  • "你只得到九条记录!?"好吧,如果您开始数 1、2、3,... 有多少小于 10 的数字?
  • @JeffreyKemp 再次阅读第二段的最后一行。
  • 嗯,这个说法是不正确的。一旦评估了所有其他谓词,ROWNUM 就会被分配一个值 - 否则您将无法在 where 子句中引用它。
  • @JeffreyKemp 请自己尝试一下。 SELECT MyColumn FROM MyTable WHERE RowNum &gt; 10SELECT MyColumn FROM MyTable WHERE RowNum &lt; 10RowNum 似乎仅在行与 WHERE 子句匹配时才会增加。因此,RowNum &gt; 10 永远不会起作用,因为RowNum 甚至不会变成 1。
  • 你不能使用 rownum>10.
【解决方案4】:
Select * From
(
    Select Row_Number() OVER (Order by empno) rno, e.* 
    From scott.emp e
)
Where rno in (1, 3, 11)

【讨论】:

    【解决方案5】:
    SELECT PRICE 
    FROM (  
      SELECT PRICE,    
      ROWNUM rnum 
      FROM AAA_PRICING
      ORDER BY PRICE ASC
      ) 
    WHERE    rnum = 2
    

    【讨论】:

    • 虽然这将返回正确的结果,但@davek 的回答更有效。
    • 这没有给出正确的答案,因为 rownum 是在“order by”之前确定的,而不是之后。您需要额外的级别,里面有“order-by”,外面有“rownum”,以使 rownums 匹配顺序。
    【解决方案6】:

    如果你在 Oracle 12 或更高版本,你可以使用结果偏移和获取子句:

    SELECT PRICE FROM AAA_PRICING 
    offset 1 rows fetch next 1 rows only
    

    【讨论】:

      【解决方案7】:
      SELECT * FROM
      (SELECT PRICE, ROWNUM AS RN FROM AAA_PRICING )
      WHERE RN = 2;
      

      【讨论】:

        【解决方案8】:
        select * from (Select Price, rownum as rn from(Select * from AAA_PRICING a order by a.Price))
        where rn=2;
        

        它将为您提供价格列中的第二低价格。如果您只想第二行删除 Order By 条件。

        【讨论】:

          【解决方案9】:

          ROWNUM 是一个伪列,它在执行SELECT 子句期间生成唯一的伪值(等于SELECT 语句o/p 中存在的记录数)。当使用WHERE 子句指定此伪列时,默认情况下它的值变为1。所以它的行为是根据它指定的比较运算符。

          SELECT * FROM (
                     SELECT ROWNUM RN, E.*
                     FROM Emp E
                    )
          WHERE RN = 10;
          

          【讨论】:

            【解决方案10】:
            select * 
            From (select PRICE, DENSE_RANK() over(ORDER BY PRICE desc) as RNO
                  From AAA_PRICING
                 ) t where RNO=2;
            

            【讨论】:

              【解决方案11】:

              问题解决了!

              在 Oracle 中选择第二行..

              select SEN_NO,ITEM_NO from (select * from master_machine where 
              sen_no ='BGCWKKL23'  and rownum <=2 order by 
              rownum desc,timestamp asc) where rownum <=1
              

              谢谢!

              【讨论】:

              • -1 这不会选择“第二行”,并且“按 rownum 排序”没有任何意义(根据定义,行集总是按 rownum 排序! )。
              猜你喜欢
              • 2020-07-27
              • 1970-01-01
              • 1970-01-01
              • 2011-05-24
              • 2016-11-03
              • 2011-03-30
              • 1970-01-01
              • 2018-08-17
              • 2012-02-27
              相关资源
              最近更新 更多