與SQL SERVER相比,Oracle沒有Top n 這樣簡單方便取前幾名的方法.
但也有相對應的方法可以實現,使用的是Oracle中的偽列:rownum.
最簡單的方法如下:
一:最簡單的問題:直接取前幾名
SELECT A.* from Company_Expense A WHERE ROWNUM<=N
(注意,在上句中我們沒有指定按哪列進行排序,而具體rownum序號是依據哪一列,現在我都不確定。但可以明確一點的是,如果我們按主鍵進行排序,rownum號不會亂,但如果指定其它列的號,序號有可能會亂)
二:麻煩一點的:取后幾名
上面方法的一點變通,首先在內部以某列進行排列,在外面取
select V.* from
(
select rownum,A.* from company_expense A
order by a.expenseid desc
)V where rownum<3
三:變態一點的:取前幾名,但值相同的記錄為同一名次
比如:對班級學生成績進行排名,第一名:100,共2名,第二名,98,共5名........如此類推,取出排名前十名的所有學生。
基本思路是:先使用Distinct取得成績的前十名,并使用rownum排序.這樣可以得出第十名的值,然后取所有成績大于等于第十名的所有學生信息。
記錄得到后,然后再與剛使用Distinct取得成績為前十名,且有rownum序號的表Join,以成績為條件。就可以得到正常的排名次序。
相關代碼請參考如下腳本:

select rownum, T.Row_Num, v.*

from (select A.Name,

A.Employee_Code,

v.STATUS,

To_Char(v.JOIN_DATE, 'yyyy-mm-dd') Join_Date,

V.Unit_Name,

p.line_description Line_Num,

sum(a.last_result) Sum_result

from QM_QUALITY_LEVEL_JUDGE A,

hr_lbr_employee_tl_tbl_v v,

Qm_Product_Line P

Where a.employee_code = v.EMPLOYEE_CODE

And A.LINE_NUM = P.Line_Num

And To_Char(A.Index_Date, 'yyyy-mm-dd') >= '2006-05-01'

And To_Char(A.Index_Date, 'yyyy-mm-dd') <= '2006-07-24'

And A.Last_Result > 0

group by A.Name,

A.Employee_Code,

V.STATUS,

V.JOIN_DATE,

V.Unit_Name,

A.Line_Num,

P.LINE_DESCRIPTION

order by Sum_Result desc, employee_code desc) v ---基本的信息

left join (select rownum row_Num, v.*

from (select distinct sum(a.last_result) Sum_result

from QM_QUALITY_LEVEL_JUDGE A,

hr_lbr_employee_tl_tbl_v v,

Qm_Product_Line P

Where a.employee_code = v.EMPLOYEE_CODE

And A.LINE_NUM = P.Line_Num

And To_Char(A.Index_Date, 'yyyy-mm-dd') >=

'2006-05-01'

And To_Char(A.Index_Date, 'yyyy-mm-dd') <=

'2006-07-24'

And A.Last_Result > 0

group by A.Name,

A.Employee_Code,

V.STATUS,

V.JOIN_DATE,

V.Unit_Name,

A.Line_Num,

P.LINE_DESCRIPTION

Order by Sum_Result Desc) v

Where rownum <= 10) T On v.Sum_Result = T.Sum_Result --得到正確的排名序號

-----以下條件是取得所有大于第十名成績的記錄

where V.sum_Result >=

(select min(Sum_Result) Sum_Result

from (select rownum row_Num, v.*

from (select distinct sum(a.last_result) Sum_result

from QM_QUALITY_LEVEL_JUDGE A,

hr_lbr_employee_tl_tbl_v v,

Qm_Product_Line P

Where a.employee_code = v.EMPLOYEE_CODE

And A.LINE_NUM = P.Line_Num

And To_Char(A.Index_Date, 'yyyy-mm-dd') >=

'2006-05-01'

And To_Char(A.Index_Date, 'yyyy-mm-dd') <=

'2006-07-24'

And A.Last_Result > 0

group by A.Name,

A.Employee_Code,

V.STATUS,

V.JOIN_DATE,

V.Unit_Name,

A.Line_Num,

P.LINE_DESCRIPTION

Order By Sum_Result Desc) v

Where rownum <= 10))