Cách để làm điều này là với các hàm Phân tích của Oracle. Kịch bản cụ thể của bạn chỉ là một biến thể của giải pháp mà tôi đã cung cấp trong một chuỗi khác.
Nếu bạn quan tâm đến việc chỉ chọn mức lương cao thứ hai thì bất kỳ DENSE_RANK (), RANK () và ROW_NUMBER () nào sẽ thực hiện thủ thuật:
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>
Tuy nhiên, nếu bạn muốn chọn thông tin bổ sung, chẳng hạn như tên của nhân viên có mức lương cao thứ hai, chức năng bạn chọn sẽ ảnh hưởng đến kết quả. Lý do chính để lựa chọn cái này hơn cái khác là điều gì sẽ xảy ra khi hòa.
Nếu bạn sử dụng ROW_NUMBER (), nó sẽ trả về nhân viên thứ hai được sắp xếp theo mức lương:điều gì sẽ xảy ra nếu có hai nhân viên có mức lương cao nhất? Điều gì sẽ xảy ra nếu có hai nhân viên buộc phải trả lương cao thứ hai? Rất tiếc, nếu bạn sử dụng RANK () và có hai nhân viên ràng buộc với mức lương cao nhất đầu tiên, thì sẽ có không bản ghi có RANK =2.
Tôi đề nghị DENSE_RANK () thường là hàm an toàn nhất để chọn trong những trường hợp này, nhưng nó thực sự phụ thuộc vào yêu cầu kinh doanh cụ thể.