💳 Задача с собеса в Ozon: сотрудники с зарплатой выше, чем у руководителя
В одном из постов меня попросили разобрать эту задачку и сделать пост про selfjoin.
Получайте этот пост 🤩
Условие: вывести список сотрудников, получающих заработную плату большую, чем у непосредственного руководителя.
1️⃣ Данные:
таблица: employees
id name salary boss_id
1 Аня 200 NULL m.salary;
Три кандидата на место ???:
1) ON e.boss_id = m.id
2) ON e.id = m.boss_id
3) ON e.boss_id = m.boss_id
3️⃣ Вариант 1: ссылка сотрудника = id руководителя:
Боря 150 > Аня 200 ? нет
Вика 180 > Боря 150 ? да
Гена 190 > Боря 150 ? да
-> Вика, Гена
Каждый сотрудник встал в пару со своим руководителем. Это правильный ответ.
4️⃣ Вариант 2: связь перевёрнута:
Аня 200 > Боря 150 ? да
Боря 150 > Вика 180 ? нет
Боря 150 > Гена 190 ? нет
-> Аня
Теперь слева руководитель, справа подчинённый. Запрос нашёл начальницу, которая получает больше подчинённого, — совсем другой вопрос.
5️⃣ Вариант 3: сравнение с коллегами:
Гена 190 > Вика 180 ? да
Вика 180 > Гена 190 ? нет
+ каждый в паре сам с собой — больше себя не бывает
-> Гена
Одинаковый boss_id — значит, у людей общий руководитель. Гена получает больше коллеги Вики, а не начальника.
6️⃣ Ловушка:
1) -> Вика, Гена верно
2) -> Аня мимо
3) -> Гена мимо
Ни один запрос не падает с ошибкой, и все возвращают правдоподобные имена. Поэтому ON проверяют глазами: слева ссылка (e.boss_id), справа id того, на кого она ссылается (m.id).
7️⃣ Финальный запрос
SELECT e.name
FROM employees e
JOIN employees m
ON e.boss_id = m.id
WHERE e.salary > m.salary;
-- Вика, Гена
Аня в ответ не попадёт: у неё boss_id пустой, пары для неё нет. И это правильно — руководителя у неё нет, сравнивать не с кем.
Итог: 🤩
SELF JOIN — это обычный JOIN таблицы с самой собой через два алиаса. Вся сложность в одной строке ON: перепутаешь поля — получишь правдоподобный, но не верный ответ.
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium
✔️ Подпишитесь на канал, чтобы не пропустить следующие разборы
🚬 Вопросы, обучение, консультации: Консультации
@dima_sqlit
В одном из постов меня попросили разобрать эту задачку и сделать пост про selfjoin.
Получайте этот пост 🤩
Условие: вывести список сотрудников, получающих заработную плату большую, чем у непосредственного руководителя.
1️⃣ Данные:
таблица: employees
id name salary boss_id
1 Аня 200 NULL m.salary;
Три кандидата на место ???:
1) ON e.boss_id = m.id
2) ON e.id = m.boss_id
3) ON e.boss_id = m.boss_id
3️⃣ Вариант 1: ссылка сотрудника = id руководителя:
Боря 150 > Аня 200 ? нет
Вика 180 > Боря 150 ? да
Гена 190 > Боря 150 ? да
-> Вика, Гена
Каждый сотрудник встал в пару со своим руководителем. Это правильный ответ.
4️⃣ Вариант 2: связь перевёрнута:
Аня 200 > Боря 150 ? да
Боря 150 > Вика 180 ? нет
Боря 150 > Гена 190 ? нет
-> Аня
Теперь слева руководитель, справа подчинённый. Запрос нашёл начальницу, которая получает больше подчинённого, — совсем другой вопрос.
5️⃣ Вариант 3: сравнение с коллегами:
Гена 190 > Вика 180 ? да
Вика 180 > Гена 190 ? нет
+ каждый в паре сам с собой — больше себя не бывает
-> Гена
Одинаковый boss_id — значит, у людей общий руководитель. Гена получает больше коллеги Вики, а не начальника.
6️⃣ Ловушка:
1) -> Вика, Гена верно
2) -> Аня мимо
3) -> Гена мимо
Ни один запрос не падает с ошибкой, и все возвращают правдоподобные имена. Поэтому ON проверяют глазами: слева ссылка (e.boss_id), справа id того, на кого она ссылается (m.id).
7️⃣ Финальный запрос
SELECT e.name
FROM employees e
JOIN employees m
ON e.boss_id = m.id
WHERE e.salary > m.salary;
-- Вика, Гена
Аня в ответ не попадёт: у неё boss_id пустой, пары для неё нет. И это правильно — руководителя у неё нет, сравнивать не с кем.
Итог: 🤩
SELF JOIN — это обычный JOIN таблицы с самой собой через два алиаса. Вся сложность в одной строке ON: перепутаешь поля — получишь правдоподобный, но не верный ответ.
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium
✔️ Подпишитесь на канал, чтобы не пропустить следующие разборы
🚬 Вопросы, обучение, консультации: Консультации
@dima_sqlit