Сотрудники, получающие зарплату выше своего руководителя

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.