Найти сотрудников, зарабатывающих больше своего менеджера
Таблица Employee(id, name, salary, manager_id), где manager_id ссылается на id другой строки. Верните сотрудников, зарабатывающих строго больше своего непосредственного менеджера.
Требования:
- менеджер сотрудника — это строка, чей
idравенmanager_idсотрудника - сравните
salaryсотрудника сsalaryэтого менеджера, оставив строго большие - верните сотрудника (и желательно менеджера) для контекста
SELECT e.name AS employee, m.name AS manager
FROM Employee e
-- ваш запрос здесь
Напишите запрос.
Соедините Employee саму с собой: один экземпляр под алиасом e (сотрудник), другой — m (менеджер), по e.manager_id = m.id, затем оставьте строки, где e.salary > m.salary. Одна таблица фигурирует дважды под разными алиасами, проходя связь manager_id → id внутри одной таблицы.
- ✗Соединять по
e.id = m.idвместоe.manager_id = m.id - ✗Пытаться выразить сравнение через
GROUP BYвместо self-join - ✗Забывать дать двум копиям одной таблицы разные алиасы
- →Почему условие соединения использует
manager_id → id, а неid → id? - →Как
LEFT JOINизменил бы результат для сотрудников без менеджера?
Задача
Найти сотрудников, зарабатывающих больше своего непосредственного менеджера.
SELECT e.name AS employee, e.salary AS emp_salary,
m.name AS manager, m.salary AS mgr_salary
FROM Employee e
JOIN Employee m ON e.manager_id = m.id
WHERE e.salary > m.salary;
Как это работает
Self-join — соединение таблицы самой с собой. Здесь Employee участвует дважды под разными алиасами:
e— строка сотрудника;m— строка его менеджера.
Связь идёт по внешнему ключу: e.manager_id = m.id сопоставляет каждому сотруднику его менеджера. После соединения остаётся сравнить зарплаты в одной строке: e.salary > m.salary.
⚠️ Канонический вопрос на self-join. Частая ошибка — соединять по e.id = m.id (строка сама с собой) вместо связи manager_id → id.