Напишите SQL-запрос для выбора сотрудников с зарплатой выше их руководителей
Что проверяют
Увидите ли вы, что руководитель лежит в той же таблице, и напишете ли соединение таблицы с самой собой. Следом спрашивают, что будет с сотрудниками без руководителя и какие индексы тут работают.
Как отвечать
Схема почти всегда одна таблица со ссылкой на себя:
select e.name, e.salary, m.name as manager, m.salary as manager_salary
from employees e
join employees m on m.id = e.manager_id
where e.salary > m.salary;Проговорите вслух, что делаете:
- self-join: та же таблица под двумя псевдонимами,
eэто сотрудник,mэто его руководитель; - NULL в
manager_id: у верхушки иерархии руководителя нет,joinтакие строки отбросит, и по условию это правильно. Нужно показать и их, беритеleft join; - сравнение с NULL: если зарплата не заполнена, условие
e.salary > m.salaryдаётunknownи строка не попадает в выборку. NULL это не ноль и не пустая строка; - альтернатива: коррелированный подзапрос
where e.salary > (select m.salary from employees m where m.id = e.manager_id). Читается хуже, а планировщик обычно всё равно свернёт его в соединение.
Покажите, что думаете про исполнение: первичный ключ по id, индекс на employees(manager_id), на больших объёмах планировщик выберет hash join по всей таблице, и это нормально: фильтр по зарплате нельзя применить до соединения.
Плюс балла добавит уточнение требований до кода: сравниваем оклад или полную компенсацию, есть ли история зарплат с датами. Если история есть, нужна актуальная запись на дату, обычно через row_number() over (partition by employee_id order by valid_from desc). А вопрос про руководителя выше по цепочке решается рекурсивным with recursive.
Где спотыкаются
Придумывают отдельную таблицу managers. Руководитель это тот же сотрудник, вторая таблица дублировала бы его строку и разошлась бы с ней на первом же повышении.
Перечисляют таблицы через запятую и забывают условие соединения, получая декартово произведение, либо смешивают условие соединения с фильтром, и на left join результат тихо ломается.
Молчат про NULL. Интервьюер ждёт именно оговорки о сотрудниках без руководителя, это половина смысла задачи.