簡體   English   中英

oracle sql wih rownum <=

[英]oracle sql wih rownum <=

如果我從查詢中刪除<符號,為什么下面的查詢沒有給出結果。即使沒有<它也必須與結果匹配?

用於獲取第二個最大id值的查詢:

select min(id) 
from(
    select distinct id 
    from student 
    order by id desc
) 
where rownum <=2


student id 
1
2
3
4

Rownum在Oracle中具有特殊含義。 它隨着每一行的增加而增加,但是優化器知道它在不斷增加,並且所有連續的行都必須滿足rownum條件。 因此,如果您指定rownum = 2 ,則由於第一行已被拒絕,因此它將永遠不會發生。

如果您對查詢做一個解釋計划,您會發現這很好。 它將顯示如下內容:

計划rownum <=

COUNT STOPKEY       

計划rownum =

FILTER

ROWNUM值不會永久分配給行(這是常見的誤解)。 表格中的行沒有數字; 您無法從表格中詢問第2行或第3行,請點擊此處獲取更多信息。

這來自提供的鏈接:

當實際分配了ROWNUM值時,許多人也感到困惑。 ROWNUM值在經過查詢的謂詞階段之后但在查詢進行任何排序或聚合之前被分配給一行。 另外,僅在分配ROWNUM值后才遞增它,這就是為什么以下查詢永遠不會返回行的原因:

select * 
 from t 
 where ROWNUM > 1;

因為第一行的ROWNUM> 1不正確,所以ROWNUM不會前進到2。因此,任何ROWNUM值都不會大於1。考慮具有以下結構的查詢:

select ..., ROWNUM
from t
where <where clause>
group by <columns>
having <having clause>
order by <columns>;

我認為這是您要查找的查詢:

select id
from (select distinct id
      from student
      order by id desc
     ) t
where rownum <= 2;

Oracle在order by之前處理rownum ,因此您需要一個子查詢來獲取前兩行。 min()強制執行僅返回一個結果但在應用rownum之前的聚合。

如果實際上只需要第二個值,則需要一個附加的子查詢層:

select min(id)
from (select id
      from (select distinct id
            from student
            order by id desc
           ) t
      where rownum <= 2
     ) t;

但是,我會這樣做:

select id
from (select id, dense_rank() over (order by id) as seqnum
      from student
     ) t
where seqnum = 2;

為什么不只是使用

select  id
from    ( select distinct id
          ,      row_number() over (order by id desc) x
          from   student
        )
where   x = 2

甚至真的很糟糕。 獲取計數和索引:)

select  id
from    ( select id
          ,      row_number() over (order by id desc) idx
          ,      sum(1) over (order by null) cnt
          from   student
          group
          by     id
        )
where   idx = cnt - 1 -- get the pre-last

要么

where   idx = cnt - 2 -- get the 2nd-last

要么

where   idx = 3 -- get the 3rd

訂購asc而不是desc

select id from student where rownum <=2 order by id asc;

嘗試這個

SELECT * 
FROM (
  SELECT id, row_number() over (order by id asc) row_num
  FROM student
     ) AS T
WHERE row_num = 2 -- or 3 ... n

ROW_NUMBER

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM