Sql 员工的收入比任何经理都高

Sql 员工的收入比任何经理都高,sql,sql-server,Sql,Sql Server,我有一张桌子: +----+-------+--------+-----------+ | Id | Name | Salary | ManagerId | +----+-------+--------+-----------+ | 1 | Joe | 70000 | 3 | | 2 | Henry | 80000 | 4 | | 3 | Sam | 60000 | NULL | | 4 | Max | 90000 | NU

我有一张桌子:

+----+-------+--------+-----------+
| 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
select name from employees 
where salary > ( 
  select min(salary) from employees
  where id in (select distinct managerid from employees)
)
如何修改此查询以获取比任何经理都多的信息?

您可以使用EXISTS:


不过,EXISTS有点混乱,因为判断某人是否是经理的唯一方法是看是否有人让他们担任经理。

你不需要任何参与。获取所有经理的最高工资,并检查员工工资是否高于最高经理工资

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
因为你比任何管理者都能得到更多

意味着您希望员工的收入超过经理的最低工资:

select a.Name
from Employee a inner join Employee b on a.ManagerId = b.Id
where a.Salary > b.Salary
select name from employees 
where salary > ( 
  select min(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)

如果要使用联接而不是子查询,请执行以下操作:

SELECT DISTINCT a.Name
FROM Employee a
CROSS JOIN Employee b 
WHERE a.Salary > b.Salary and b.Manager ID IS NULL

使用交叉连接生成笛卡尔积,然后使用相同的where子句限制笛卡尔积。交叉加入员工b,其中a.薪资>b.薪资。不过,您可能不想返回经理ID,而是要返回一份比任何一位经理的收入都高的员工的明确列表……但如果您这样做,您将以这种方式返回这些员工。这也是我要建议的。