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,而是要返回一份比任何一位经理的收入都高的员工的明确列表……但如果您这样做,您将以这种方式返回这些员工。这也是我要建议的。