When working with Oracle SQL, we often need to retrieve the Nth highest salary (like 2nd, 3rd, etc.). While analytic functions like RANK() or DENSE_RANK() are commonly used for this, some scenarios or database versions require solutions without analytic functions.
This tutorial shows how to find the 3rd highest salary using only nested subqueries.
Step 1: Create a Sample employees Table
CREATE TABLE employees ( id NUMBER, name VARCHAR2(50), salary NUMBER ); -- Insert sample data INSERT INTO employees VALUES (1, 'Alice', 5000); INSERT INTO employees VALUES (2, 'Bob', 7000); INSERT INTO employees VALUES (3, 'Charlie', 6000); INSERT INTO employees VALUES (4, 'Diana', 7000); INSERT INTO employees VALUES (5, 'Eva', 8000); COMMIT;
Step 2: Query to Find the 3rd Highest Salary (Without Analytic Functions)
SELECT *
FROM employees
WHERE salary = (
SELECT MAX(salary)
FROM employees
WHERE salary < (
SELECT MAX(salary)
FROM employees
WHERE salary < (
SELECT MAX(salary)
FROM employees
)
)
);
How It Works
Let’s break down the query from the inside out:
SELECT MAX(salary) FROM employees
→ Gets the highest salary (1st maximum).SELECT MAX(salary) FROM employees WHERE salary < (...)
→ Gets the 2nd highest salary, by excluding the top salary.- The outermost subquery repeats the same logic to get the 3rd highest salary, excluding the top two salaries.
- Finally, the outer
SELECTretrieves all employee rows whose salary matches the 3rd maximum.
Output
Based on the sample data, the result would be:
| ID | NAME | SALARY |
|---|---|---|
| 3 | Charlie | 6000 |
If multiple employees had a salary of 6000, all of them would be returned.
Notes
- This method works in all versions of Oracle, including Oracle 11g and earlier.
- It handles duplicate salaries properly.
- To find the 4th, 5th, or Nth highest salary, you just nest more
SELECT MAX()queries. - You can replace
salarywith any numeric column (likecommission,bonus, etc.).
