Почему этот выбор не выбирает строки - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь выбрать наиболее высокооплачиваемого сотрудника в отделе ИТ, но я не выбираю ни одной строки. Зарплата и имена находятся в таблице, называемой служащими, а имя отдела - в таблице, названной отделами. Может кто-нибудь объяснить, почему это не выбрать строки и как я должен это сделать?

SELECT first_name, last_name, salary, department_name
FROM employees
JOIN departments on departments.department_id = employees.department_id
WHERE salary = (SELECT max(salary) FROM employees WHERE department_name = 'IT'); 

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Вы можете использовать dense_rank, если в ИТ-отделе имеется более одного человека с самым высоким доходом.

select   
    first_name, 
    last_name, 
    salary, 
    department_name
from
(
    select 
        first_name, 
        last_name, 
        salary, 
        department_name,
        dense_rank() over (partition by department_name order by salary desc) as rnk
    FROM employees e
    JOIN departments d
    on d.department_id = e.department_id
    where department_name = 'IT'
) val
where rnk = 1
1 голос
/ 24 апреля 2020

Почему этот выбор не выбирает строки?

Ваш запрос не выполнен, поскольку в таблице employees нет столбца department_name. Таким образом, ваш подзапрос не выполняет то, что вы ожидаете:

where salary = (SELECT max(salary) FROM employees WHERE department_name = 'IT'); 

Если вы хотите сделать это с подзапросом, вам нужно сопоставить его:

select e.first_name, e.last_name, e.salary, d.department_name
from employees e
inner join departments d on d.department_id = e.department_id
where 
    d.department_name = 'IT'
    and e.salary = (select max(e1.salary) 
                    from employees e1 
                    where e1.department_id = e.department_id); 
0 голосов
/ 24 апреля 2020

Использовать row_number():

SELECT t.*
FROM (SELECT emp.first_name, emp.last_name, dempt.salary, dempt.department_name,
             ROW_NUMBER() OVER(PARTITION BY dept.department_name ORDER BY dept.salary DESC) AS SEQ
      FROM employees emp JOIN 
           departments dept 
           ON dept.department_id = emp.department_id
      WHERE dempt.department_name = 'IT'
     ) t
WHERE seq = 1;

Если у зарплаты есть связи, вы можете использовать rank().

...