Это очень неэффективный коррелированный запрос, чтобы вернуть работника с 4-й высшей зарплатой.
SELECT *
FROM employee_test e1
WHERE 3 = (SELECT DISTINCT count(*)
FROM employee_test e2
WHERE e2.emp_sal > e1.emp_sal);
Если предположить, что зарплаты (emp_sal) являются уникальными, подзапрос подсчитывает, сколько сотрудников имеют более высокую зарплату, чем работник в «e1». Если счет равен 3, то это сотрудник с 4-й высшей зарплатой.
Если есть связь для четвертого (например, через 6 или 10), в результате будут показаны все связи. Если есть связь, которая включает в себя четвертый и один более высокий слот, например. 2-го или 4-го, 3-го и 4-го, то результатов не будет, поскольку NO значение emp_sal имеет ТОЧНО 3 записи с более высокими значениями emp_sal.
Чем лучше форма будет
select top(1) with ties *
from (
select *, rn=rank() over (order by emp_sal desc)
from employee_test
) x
where rn <= 4
order by rn desc;
Это показывает прямо 4th высокую зарплату (и связи если таковые имеются), или если есть связь через лиц 3-го по 6-й (покрытие 4 спот #), то это будет шоу с 3-го по 6-й.
Это очень неэффективный способ сделать это. –
Этот запрос имеет очень мало смысла при попытке прочитать его, поэтому было бы кошмаром поддерживать ... если он действительно работает! Можете ли вы поделиться образцом таблицы? – Penfold
Кроме того, вы хотите, чтобы «n» количество зарплат было параметром хранимой процедуры? Или это будет исправлено в SQL, например. всегда в топ-10? – Penfold