Сотрудники, зарабатывающие больше, чем менеджеры - PullRequest
0 голосов
/ 30 апреля 2019

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

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

Мне нужно, чтобы сотрудники зарабатывали больше, чем менеджеры

Я создал запрос для сотрудников, которые зарабатывают больше, чем их менеджеры:

select a.Name
from Employee a inner join Employee b on a.ManagerId = b.Id
where a.Salary > b.Salary

Как я могу изменить этот запрос, чтобы получить больше, чем ЛЮБЫЕ менеджеры?

Ответы [ 4 ]

5 голосов
/ 30 апреля 2019

Для этого вам не нужно присоединяться.Получите максимальную зарплату всех менеджеров и убедитесь, что зарплата сотрудника превышает максимальную зарплату менеджера

select a.Name
from Employee a 
where a.Salary > 
(SELECT MAX(salary) FROM Employee m WHERE m.id IN (SELECT managerID FROM Employee))--or however you determine managers
1 голос
/ 30 апреля 2019

Вместо этого вы можете использовать EXISTS:

SELECT E.[Name]
FROM dbo.Employee E
WHERE EXISTS (SELECT 1
              FROM dbo.Employee E2
                   JOIN dbo.Employee M ON E2.ManagerID = M.id
              WHERE M.Salary < E.Salary);

Хотя EXISTS немного грязно, так как единственный способ определить, является ли кто-то менеджером, если кто-то имеет его в качестве менеджера.

0 голосов
/ 30 апреля 2019

Если вы хотите использовать объединение вместо подзапроса:

SELECT DISTINCT a.Name
FROM Employee a
CROSS JOIN Employee b 
WHERE a.Salary > b.Salary and b.Manager ID IS NULL
0 голосов
/ 30 апреля 2019

для получения более ЛЮБЫХ менеджеров

означает, что вы хотите, чтобы сотрудники зарабатывали больше, чем минимум зарплата менеджеров:

select name from employees 
where salary > ( 
  select min(salary) from employees
  where id in (select distinct managerid from employees)
)

или

select name from employees 
where salary > ANY ( 
  select salary from employees
  where id in (select distinct managerid from employees)
)

Если вы хотите, чтобы только сотрудники, не являющиеся менеджерами, использовали CTE:

with cte as (select distinct managerid from employees)
select name from employees 
where 
  id not in cte
  and 
  salary > (select min(salary) from employees where id in cte)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...