52. Найти сотрудников с зарплатой выше, чем у руководителя
Условие задачи:
Дана таблица EMPLOYEE(ID, NAME, SALARY, DEPARTMENT_ID, CHIEF_ID).
Необходимо вывести сотрудников, чья зарплата выше зарплаты их непосредственного руководителя.
Поле CHIEF_ID содержит ID руководителя сотрудника.
Код:
CREATE TABLE EMPLOYEE (
ID INT,
NAME VARCHAR(256),
SALARY INT,
DEPARTMENT_ID INT,
CHIEF_ID INT
);
-- Пример данных
-- ID | NAME | SALARY | DEPARTMENT_ID | CHIEF_ID
-- ---+-----------+--------+---------------+---------
-- 1 | Иванов | 150 | 1 | NULL
-- 2 | Петров | 250 | 1 | 1
-- 3 | Сидоров | 550 | 1 | 1
-- 4 | Медведев | 350 | 2 | 6
-- 5 | Соколов | 350 | 2 | 6
-- 6 | Рыбников | 150 | 2 | NULL
-- 7 | Арбузов | 450 | 3 | NULL
-- 8 | Орехов | 650 | 3 | 7
-- 9 | Дынин | 50 | 3 | 7
Спойлеры к решению
Подсказки
💡 Используй
💡 Один алиас будет представлять сотрудника, второй — его руководителя.
💡 Связь между ними задаётся условием
💡 После соединения сравни зарплаты сотрудника и руководителя.
self join: соедини таблицу EMPLOYEE саму с собой.💡 Один алиас будет представлять сотрудника, второй — его руководителя.
💡 Связь между ними задаётся условием
e.CHIEF_ID = c.ID.💡 После соединения сравни зарплаты сотрудника и руководителя.
Решение
SELECT
e.NAME AS employee_name,
e.SALARY AS employee_salary,
c.NAME AS chief_name,
c.SALARY AS chief_salary
FROM EMPLOYEE e
JOIN EMPLOYEE c
ON c.ID = e.CHIEF_ID
WHERE e.SALARY > c.SALARY;
Таблица соединяется сама с собой:
JOIN EMPLOYEE c
ON c.ID = e.CHIEF_ID
e представляет сотрудника, а c — его непосредственного руководителя.
После этого остаются только сотрудники, чья зарплата выше зарплаты руководителя:
WHERE e.SALARY > c.SALARY
Для приведённых данных результат будет таким:
employee_name | employee_salary | chief_name | chief_salary
--------------+-----------------+------------+-------------
Петров | 250 | Иванов | 150
Сидоров | 550 | Иванов | 150
Медведев | 350 | Рыбников | 150
Соколов | 350 | Рыбников | 150
Орехов | 650 | Арбузов | 450
Сотрудники с CHIEF_ID = NULL автоматически не попадут в результат, поскольку для них не найдётся строка руководителя при INNER JOIN.