話說我自從學習.net以來,一直搭配的資料庫就是SqlServer,也因為之前公司都用Sql,讓我也沒機會接觸到Oracle,最近換到這家新公司,它們都是用Oracle比較多,就在前幾天,在寫一個報表時。


通常我們要取出前幾筆資料,在Sql會下這樣的語法:
                                  select top xxx.......


而我發現在Oracle沒有top可以用=.= ,便上網去找了一下,原來是使用rownumㄚ!
很直覺的,我就下了以下的語法:
                                 select xxx from xxx where rownum<=xx


嗯,測試了一下,沒有錯,繼續寫程式,但忽然發現,當我加上order by條件居然筆數會整個亂掉,昨天就立刻請教了一下lolota,原來,在Oracle中,rownum會比group by、order by更先執行,因此要用子查詢就ok啦

   select xxx from (select xxx from xxx order by xxx) where rownum<=xx

Oracle官網有詳細解說,我居然都沒發現=.=
http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html



關連文章

回應

  • 小歐ou 2009/5/12 下午 10:17 回覆

    # re: Rownum搭配Order by

    我也是最近專案寫到 Oracle,不過我是卡 字串連結,SQL server 是用 "+" , Oracle 是用 || ,還有找出空值使用 is null

    果然中微軟的毒太深了 = =

  • WizardWu 2009/5/12 下午 10:45 回覆

    # re: Rownum搭配Order by

    最麻煩的是處理資料庫撈資料「分頁」的預存程序,
    SQL Server、Sybase 的預存程序,可直接回傳一個「二維表格式」如 DataTable 的型別,加上 SQL Server 2005 以後有 ROW_NUMBER 函數超方便、效能又好。

    Oracle 不行,即使到了 11g,預存程序也只能回傳簡單的字串或數值。
    得自己用 ROWNUM 關鍵字寫 C# 搭配 SQL 語句去處理分頁,但效能差很多。

  • hatelove 2009/5/12 下午 11:33 回覆

    # re: Rownum搭配Order by

    用Nhibernate!!

  • dyco 2009/5/13 下午 05:48 回覆

    # re: Rownum搭配Order by

    妳好呀~

  • Maxi 2009/5/21 下午 11:26 回覆

    # re: Rownum搭配Order by

    所以還是盡力不要用品牌獨有功能比較好
    又或者用ORM囉

  • 旭峰 2009/8/16 下午 01:59 回覆

    # re: Rownum搭配Order by

    我是常會碰到這種問題…
    像是SQLServer變數名稱命名是以「@」為開頭,而Oracle卻是「:」。

    所以手邊要備有相關的參考書,才不會東西寫到一半鬼打牆,找都找不到問題在哪…

  • 打雜妹 2010/1/17 上午 01:16 回覆

    # re: Rownum搭配Order by

    Oracle可以回傳像SQL 的DataTable,只是接的方式要用DataReader

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 5 and 2 and type the answer here:

Copyright © 2008 design by Iris Kang.