2015-05-28 4 views
-3
select E.eid from Employee E 
    where E.salary = (
     select max (E2.salary) from Employee E2 
      where E2.salary ≠ (
       select max (E3.salary) from Employee E3); 

Как проходит вышеуказанный запрос? Что возвращает этот запрос? Каков порядок выполнения подзапросов?сложных запросов в sql

ответ

0

Самый дальний в первом. Сначала он получает самую высокую зарплату, чем E3, а затем находит наивысшее, что не является (вторым по величине), а затем находит сотрудников, которые соответствуют этой второй самой высокой зарплате.

Для того, чтобы вернуть идентификатор любого сотрудника, у которого есть вторая зарплата с наивысшим рейтингом (галстуки ведут себя так, что все с высшей зарплатой будут устранены на уровне E2, возвращая всех со второй самой высокой зарплатой).

Я подозреваю, что вы получаете downvotes, потому что это было тривиально проверять на sqlfiddle, который также показал бы ваши синтаксические ошибки (не закрывал все скобки).

Вот скрипка из него: http://sqlfiddle.com/#!9/a7d18/6

+0

Не обеспокоен syntax.Just хочет быть ясно, с функционированием заявлений. В случае функции aggegate сначала записываются записи, а затем вычисляется совокупность? –

+0

Я думаю, что самый простой способ описать это: он пытается оценить первую часть (e.salary = X), но затем должен вычислить внутреннюю (X), затем попытается вычислить вторую часть (E2.salary < > Y), но затем нужно вычислить, что внутреннее (Y), поэтому оно вычисляет самый дальний в (Y), затем может оценивать следующий уровень (X), а затем, наконец, может вернуть внешний вид. С точки зрения первой выборки, а затем агрегации, предполагающей блокировку по умолчанию, она извлекается, но не позволяет кому-либо изменять значения, пока они заканчивают все остальное. Он не выполняет предварительную выборку, он просто вычисляет каждый запрос как полное действие. –

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