要做到這一點的方法是使用Oracle的分析函數。您的特定場景只是我在another thread中提供的解決方案的一個變體。
如果你有興趣只是選擇第二最高的薪水那麼任何DENSE_RANK(),RANK()和ROW_NUMBER(的)會做的伎倆:
SQL> select * from
2 (select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 (select distinct sal
6 from emp)
7 )
8 where rnk = 2
9/
SAL RNK
---------- ----------
3000 2
SQL>
但是,如果你想選擇其他信息,例如薪水第二高的員工姓名,則您選擇的功能會影響結果。選擇一個在另一個之上的主要原因是當發生平局時發生的情況。
如果您使用ROW_NUMBER()函數,它將返回按工資排序的第二名員工:如果有兩名員工爲最高工資綁定,該怎麼辦?如果有兩名員工爭取第二高的薪水呢? Wheareas如果使用RANK(),並有兩名員工爲搭售第一薪水最高,將會有沒有記錄與RANK = 2
我建議DENSE_RANK()是通常在這種情況下,選擇最安全功能,但它確實取決於具體的業務需求。
來源
2010-03-22 10:45:15
APC
-1我不確定這會返回什麼,但可能不是什麼問題是關於:-) – 2010-03-22 09:53:17
這取決於他的意思是「方法」。 對我來說,一個方法是一個獲得結果的過程;這是我建議的方法。感謝我的第一次downvote :)。 – systempuntoout 2010-03-22 09:57:08
@Aaron:或許不是最有效的方法來返回結果(因爲它使用自聯接),但它會返回正確的答案,*提供的薪水是唯一的*(如果有三個人,它將不起作用與最高工資相同)。 – 2010-03-22 10:10:08