SQL выбирает значения для отдельного идентификатора, где не минимальное значение - без подзапроса - Oracle SQL - PullRequest
0 голосов
/ 16 октября 2018

У меня есть 2 таблицы

Departments

department_id, department_name

и

Employees

Employee_id, job_id, salary, department_id

Для каждой группы department_id и Job_id мне нужно показать все значения выше минимального значения без использованияsub-select.Как я могу это сделать.Вот мой текущий код.В настоящее время есть и другие вещи.

SELECT e.department_id, e.job_id, e.salary
    FROM employees e 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' AND salary 
          != MIN(e.salary)
    GROUP BY e.department_id, e.job_id
    ORDER BY e.department_id, e.job_id;

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я не уверен, что подвыбор означает в этом контексте.Я бы настоятельно рекомендовал оконные функции:

SELECT department_id, job_id, salary
FROM (SELECT e.department_id, e.job_id, e.salary,
             MIN(e.salary) OVER (PARTITION BY e.department_id, e.job_id)
      FROM employees e JOIN
           departments d 
           ON e.department_id = d.department_id
      WHERE UPPER (e.job_id) NOT LIKE '%REP' AND 
            UPPER(d.department_name) NOT IN ('IT', 'SALES')
     ) ed
WHERE salary > min_salary
ORDER BY department_id, job_id;
0 голосов
/ 16 октября 2018

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...