Цель — получить сотрудников, зарплата которых превышает среднюю зарплату их собственного отдела. Два распространённых подхода — это коррелированный подзапрос и CTE с JOIN.
Для каждой строки подзапрос пересчитывает среднюю зарплату отдела и сравнивает её с зарплатой текущего сотрудника.
SELECT e.name, e.salary, e.department_id
FROM employees e
WHERE e.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e.department_id
);
Common Table Expression (CTE) предварительно вычисляет среднюю зарплату по отделам один раз, а затем джойнит результат обратно с таблицей сотрудников.
WITH dept_avg AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN dept_avg d ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;
avg_salary в выводВ подходе с коррелированным подзапросом подзапрос выполняется один раз для всего запроса, и его результат кэшируется для всех строк, что делает его одинаково эффективным с подходом CTE на больших датасетах.
Новый — ещё не проверен сообществом
Вы