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