Напишите SQL-запрос для выбора сотрудников с зарплатой выше их руководителей
Что проверяют
Понимаете ли вы соединение таблицы с самой собой. Иерархия лежит в одной таблице, ссылка manager_id смотрит в её же первичный ключ, и весь вопрос в том, сумеете ли вы завести два псевдонима и не перепутать стороны условия.
Как отвечать
select e.name as employee, 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;Читается так: e это сотрудник, m это его руководитель, соединение идёт по ссылке manager_id. Проговорите, кого выборка не покажет: у верхнего руководителя ссылка пустая, внутреннее соединение его отбрасывает, и для задачи это правильно, потому что сравнивать не с кем. Если зарплата бывает незаполненной, строка тоже выпадет: сравнение с NULL не истинно и не ложно, нужен coalesce или явное решение, что делать с такими записями.
Полезно добавить два продолжения, их спрашивают следом. Индекс по manager_id убирает повторное сканирование таблицы при соединении. А если нужен не прямой руководитель, а вся цепочка вверх, задача решается рекурсивным запросом, а не новым соединением на каждый уровень. В Java такую выборку держат нативным запросом с проекцией: обход через ленивую связь даст отдельный запрос на каждого сотрудника.
Где спотыкаются
Меняют стороны условия местами и пишут on e.id = m.manager_id. Запрос выполняется, но список выходит обратный: в нём руководители, которые получают меньше подчинённого.
Второе: не проговаривают сотрудников без руководителя. Интервьюер почти всегда спрашивает про них отдельно, и тут нужно ответить, что внутреннее соединение убирает их осознанно, а LEFT JOIN вернёт их с пустым сравнением.
Третье: решают задачу в Java. Достают всех сотрудников, строят словарь по идентификатору и сравнивают в цикле. На тестовых данных работает, но при реальном объёме это выгрузка всей таблицы ради фильтра, который база делает одним соединением.