Как работает мой простой подзапрос, когда используется агрегатная функция и предложение Group by? - PullRequest
0 голосов
/ 27 сентября 2019

У меня проблема с домашним заданием, извините, я очень нуб.

У меня есть таблица Employee.Я хочу, чтобы запрос нашел имя сотрудника, получающего самую высокую зарплату в своих отделах

Я написал:

Select emp_name 
from employee 
where salary=any(select max(salary) from employee group by dept_no)

[enter image description here]

Имя таблицы: сотрудник

emp_name  salary   Dept_no
e1         1000     10
e2         2000     10
e3         2000     20
e4         3000     20

вывод должен быть:

e2 
e4

но это неправильно, так как кто-то может сказать мне, почему?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

В вашем коде отсутствует ссылка на отделы и устанавливается условие только для зарплаты.Вы должны присоединить свой подзапрос к таблице:

Select e.emp_name 
from employee e inner join(
  select dept_no, max(salary) salary
  from employee 
  group by dept_no
) t on t.dept_no = e.dept_no and t.salary = e.salary

Или с НЕ СУЩЕСТВУЮЩИМ:

Select e.emp_name 
from employee e 
where not exists(
  select 1 from employee
  where dept_no = e.dept_no and salary > e.salary
) 
0 голосов
/ 27 сентября 2019

Ваша проблема в том, что между отделами нет связи.Таким образом, кто-то в отделе B может получить максимальную зарплату в отделе A, но, возможно, не самый высокий заработок в этом отделе.

Для этого подхода я бы рекомендовал корреляционную оговорку в подзапросе, а не GROUP BY:

select e.emp_name 
from employee e
where e.salary = (select max(e2.salary)
                  from employee e2
                  where e2.dept_no = e.dept_no
------------------------^ correlation clause
                 );

Обратите внимание на использование псевдонимов таблиц и квалифицированных имен столбцов.Вы должны всегда квалифицировать все ссылки на таблицы при написании запросов - это гарантирует, что запрос делает то, что вы хотите, и делает запрос более понятным для других.

Если производительность является проблемой, тогдаиспользуйте employee(dept_no, salary).

...