Использование CTE
поможет вам предоставить набор результатов для использования в области запроса.
Таким образом, в следующем запросе сначала я предоставляю набор результатов и извлекаю ожидаемые данные изатем я использую набор результатов cte
и нахожу окончательный результат.
with
cte
as
(
select
e.department_id, e.job_id, min(e.salary) as salary_min
from
employees e
inner join
departments d
on
e.department_id = d.department_id
where
upper(e.job_id) not like '%REP'
and
upper(d.department_name) not like 'IT'
and
upper(d.department_name) not like 'SALES'
group by
e.department_id, e.job_id
)
select
e.department_id ,
e.Employee_id ,
e.job_id ,
e.salary
from
cte
inner join
employees e
on
cte.department_id = e.department_id
and
cte.job_id = e.job_id
and
e.salary > cte.salary_min
ОБНОВЛЕНИЕ:
Этот запрос более оптимизирован, чем раньше, и используется только таблица Employeeодин раз.В этом запросе я использовал оконную функцию для извлечения минимальной зарплаты.
with
cte
as
(
select
e.department_id, e.Employee_id, e.job_id, e.salary, min(e.salary) over(partition by e.department_id, e.job_id) as salary_min
from
employees e
inner join
departments d
on
e.department_id = d.department_id
where
upper(e.job_id) not like '%REP'
and
upper(d.department_name) not like 'IT'
and
upper(d.department_name) not like 'SALES'
)
select
department_id ,
Employee_id ,
job_id ,
salary
from
cte
where
salary > salary_min