SQL不使用子查询仅用INTERSECT/UNION/EXCEPT查找第二高薪资及对应员工
第二高薪资员工信息查询方案(仅使用集合运算符,无嵌套子查询)
前提假设
我们默认使用通用员工表结构,你可以根据实际业务表名、字段名做调整:
- 表名:
employee - 包含字段:
emp_id(员工ID)、emp_name(员工姓名)、salary(薪资)
实现思路
核心通过EXCEPT运算符实现逐层过滤,全程不使用嵌套子查询:
- 先筛选出最高薪资的员工集合,从全体员工中排除这部分,得到所有薪资低于最高值的员工
- 再从上述结果中排除所有「存在其他员工薪资高于自身」的员工,剩下的就是薪资为第二高的全部员工
可直接运行的SQL代码
( SELECT emp_id, emp_name, salary FROM employee EXCEPT -- 排除最高薪资的所有员工 ( SELECT emp_id, emp_name, salary FROM employee EXCEPT SELECT e1.emp_id, e1.emp_name, e1.salary FROM employee e1 JOIN employee e2 ON e1.salary < e2.salary ) ) EXCEPT -- 排除剩余集合中薪资不是当前范围内最高的员工 SELECT e1.emp_id, e1.emp_name, e1.salary FROM employee e1 JOIN employee e2 ON e1.salary < e2.salary
逻辑验证
- 如果公司仅存在单一薪资档位,查询返回空结果,符合预期
- 如果多名员工薪资同为第二高,会全部返回,满足需求
- 所有运算仅使用
EXCEPT集合运算符,没有嵌套子查询,符合限制要求
内容的提问来源于stack exchange,提问作者06Sto
相关产品推荐
相关产品推荐

