Умова задачі
Перед тим, як перейти до рішення, подумайте, як ви б підійшли до вирішення цієї задачі, якщо б вам потрібно було виконати її вручну.
Дивлячись на таблицю, я бачу, що Джо та Генрі мають ненульовий managerID. Що це означає? Нас цікавлять співробітники, які мають керівника.
Рішення: для заданого id ми повинні переконатися, що managerID існує, і потім перевірити, чи є зарплата для заданого id (salary) більше за зарплату керівника (managerId).
Першим кроком виведемо дані таблиці для id, для яких існує managerID, і також виведемо дані для managerID, щоб краще зрозуміти картину.
id name salary manager ID
1 joe 70000 3
2 henry 80000 4
id name salary manager ID
3 Sam 60000 Null
4 Max 90000 Null
Як ви можете бачити, для того щоб отримати потрібний набір даних, потрібно порівняти таблицю з її копією.
Як ми знаємо, в SQL існує концепція Inner Join. Цю концепцію можна застосувати тут.
Ми можемо об'єднати дві таблиці за допомогою колонок.
Дивлячись на задачу, якщо ми об'єднаємо за id та managerId, ми отримаємо потрібний набір даних, який можна буде використовувати для отримання відповіді.
Крок 1) Давайте зробимо inner join цієї таблиці з її копією за id та managerID і подивимося на результат.
Тепер ми маємо дві таблиці замість однієї.
Таблиця 1
id name salary manager ID
1 joe 70000 3
2 henry 80000 4
3 Sam 60000 Null
4 Max 90000 Null
Таблиця 2
id name salary manager ID
1 joe 70000 3
2 henry 80000 4
3 Sam 60000 Null
4 Max 90000 Null
select * from Employee e1 inner join Employee e2 on e1.id = e2.managerId
Виведення
Ключове слово INNER JOIN вибирає записи, що мають співпадіння значень у обох таблицях.
Отже, лише для id 3 та 4 з Таблиці 1 будуть співпадіння з managerID 3 та 4 у Таблиці 2.
Тепер давайте зробимо inner join цієї таблиці з її копією за managerID та id і подивимося на результат.
select * from Employee e1 inner join Employee e2 on e1.managerId = e2.id
Виведення
Крок 2) Як знайти, до якої таблиці належить керівник?
Тепер починається складний момент. Дивлячись на таблицю співробітників, ми повинні запитати себе: хто є керівниками, а хто співробітниками? (Підказка: дивіться на стовпець managerID). Правильно, Джо та Генрі — це співробітники, а Сэм та Макс — керівники. Нам потрібно якось вказати нашому запиту, що Сэм і Макс є керівниками.
Ви можете вибрати будь-який запит з кроку 1, але важливо знати, яка таблиця містить managerID.
Крок 3) Остаточна відповідь
Відповідь 1
select e2.name as Employee from Employee e1 inner join Employee e2 on e1.id = e2.managerID
where e1.salary < e2.salary
Відповідь 2
select e1.name as Employee From Employee e1 inner join Employee e2 on e1.managerId = e2.id
where e2.salary < e1.salary
Перекладено з: Leet code 181. Employees Earning More Than Their Managers explanation