Может кто-нибудь объяснить, как работает следующий SQL-запрос для получения 'n' самой высокой зарплаты - PullRequest
0 голосов
/ 02 февраля 2009

ВЫБРАТЬ * ОТ сотрудника А ГДЕ 3 = (выберите количество (*) +1 от сотрудника Б где B.salary> A.salary)

Получает 3-ю самую высокую зарплату; Может кто-нибудь объяснить логику этого запроса и как он работает.

Ответы [ 4 ]

4 голосов
/ 02 февраля 2009

Словом, этот запрос будет «Выберите сотрудника, у которого есть два других человека с большей зарплатой». Таким образом, результат - работник с третьей по величине зарплатой.

Обратите внимание, что этот запрос может завершиться ошибкой, если два или более человека имеют одинаковую зарплату.

1 голос
/ 02 февраля 2009

Это то, что известно как коррелированный подзапрос. Вы можете думать об этом как о цикле по всем записям во внешнем запросе, и для каждой он оценивает запрос в предложении where. (Это происходит потому, что запрос в предложении where ссылается на псевдоним «A» внешнего запроса)

Таким образом, для каждого сотрудника учитывается число сотрудников с более высокой зарплатой.

Вероятно, вы могли бы реализовать эту логику быстрее в SQL 2005 и 2008, используя функцию ROW_NUMBER.

например.

WITH SalaryOrder AS
(
SELECT *
   , ROW_NUMBER() OVER(ORDER BY Salary DESC) SalaryRank
FROM employee
)
SELECT * 
FROM SalaryOrder
WHERE SalaryRank = 3
1 голос
/ 02 февраля 2009

Это будет работать только с определенной зарплатой:

Для каждого сотрудника посчитайте количество строк, где зарплата больше, чем зарплата сотрудника. Если счет 2 + 1, верните сотрудника

Поэтому он вернет 3-го emplyee.

Я бы сделал это с помощью SELECT TOP 1 FROM (SELECT TOP 3 * FROM Employee ORDER BY Salary DESC) или ORDER BY SALARY ASC

0 голосов
/ 02 февраля 2009

Просто чтобы проиллюстрировать это на примере, скажем, зарплата такая, как ниже; повторил данные для B,

EmpA EmpB

5000 5000

3000 3000

2000, 2000

1500 1500

1000 1000

500 500

В первом разборе A.Salary равен 5000, поэтому весь счет зарплаты из B, который превышает 5000, равен 0. Добавьте один и его 1. Теперь это будет самая высокая зарплата. В вашем примере A.Salary равен 2000, поэтому все количество зарплат от B, превышающее 2000, будет равно 2, добавьте единицу, и будет 3. Соедините 3 = 3, и A.Salary со значением 2000 будет выбран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...