2013-04-04 4 views
1

Я нашел следующее решение для поиска в Google, но я не могу его понять. может кто-нибудь объяснить, как этот запрос обрабатывается.Как получить n количество максимальной зарплаты в SQL Server 2005

SELECT * 
FROM employee_test e1 
WHERE 3 = (SELECT DISTINCT count(*) 
      FROM employee_test e2 
      WHERE e2.emp_sal > e1.emp_sal) 
+0

Это очень неэффективный способ сделать это. –

+0

Этот запрос имеет очень мало смысла при попытке прочитать его, поэтому было бы кошмаром поддерживать ... если он действительно работает! Можете ли вы поделиться образцом таблицы? – Penfold

+0

Кроме того, вы хотите, чтобы «n» количество зарплат было параметром хранимой процедуры? Или это будет исправлено в SQL, например. всегда в топ-10? – Penfold

ответ

2

Это очень неэффективный коррелированный запрос, чтобы вернуть работника с 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-й.

+0

Спасибо, сэр за то, что дал мне ответ, но я хочу больше деталей, как это делается рекурсивно или петля ....... – social

+1

Рекурсии нет. Нет никакого цикла циклов TSQL. Внутренний механизм SQL Server выполняет вложенные циклы для подзапроса, запуская его один раз для записи EACH во внешнем запросе. – RichardTheKiwi

+0

thank u !!!!!!!!!! – social

Смежные вопросы