亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何正確使用Oracle ORDER BY和ROWNUM?

如何正確使用Oracle ORDER BY和ROWNUM?

滄海一幻覺 2019-11-28 10:31:44
我很難將存儲過程從SQL Server轉換為Oracle,以使我們的產品與其兼容。我有一個查詢,它根據時間戳返回一些表的最新記錄:SQL Server:SELECT TOP 1 *FROM RACEWAY_INPUT_LABOORDER BY t_stamp DESC=>這將返回我最近的記錄但是甲骨文:SELECT *FROM raceway_input_labo WHERE  rownum <= 1ORDER BY t_stamp DESC=>這將返回我最舊的記錄(可能取決于索引),而不管ORDER BY語句如何!我以這種方式封裝了Oracle查詢以符合我的要求:SELECT * FROM     (SELECT *     FROM raceway_input_labo      ORDER BY t_stamp DESC)WHERE  rownum <= 1而且有效。但這對我來說聽起來像是一個駭人聽聞的駭客,尤其是如果我在涉及的表中有很多記錄的時候。實現此目標的最佳方法是什么?
查看完整描述

3 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

該where聲明被執行之前的order by。因此,您所需的查詢是說“ 先行,然后按 t_stamp desc 排序 ”。那不是您想要的。


子查詢方法是在Oracle中執行此操作的正確方法。


如果要在兩個服務器上都可以使用的版本,可以使用:


select ril.*

from (select ril.*, row_number() over (order by t_stamp desc) as seqnum

      from raceway_input_labo ril

     ) ril

where seqnum = 1

外部*將在最后一列中返回“ 1”。您可能需要單獨列出各列以避免這種情況。


查看完整回答
反對 回復 2019-11-28
?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

使用ROW_NUMBER()代替。ROWNUM是一個偽列,ROW_NUMBER()是一個函數。您可以了解它們之間的差異,并查看以下查詢的輸出差異:


SELECT * FROM (SELECT rownum, deptno, ename

           FROM scott.emp

        ORDER BY deptno

       )

 WHERE rownum <= 3

 /


ROWNUM    DEPTNO    ENAME

---------------------------

 7        10    CLARK

 14       10    MILLER

 9        10    KING



 SELECT * FROM 

 (

  SELECT deptno, ename

       , ROW_NUMBER() OVER (ORDER BY deptno) rno

  FROM scott.emp

 ORDER BY deptno

 )

WHERE rno <= 3

/


DEPTNO    ENAME    RNO

-------------------------

10    CLARK        1

10    MILLER       2

10    KING         3


查看完整回答
反對 回復 2019-11-28
  • 3 回答
  • 0 關注
  • 2131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號