题解 | #获取员工当前薪水比经理当前薪水还高的相关信息#
获取员工其当前的薪水比其manager当前薪水还高的相关信息
https://www.nowcoder.com/practice/f858d74a030e48da8e0f69e21be63bef
这道题大概花了15分钟想出了一个思路,其实我的纠结点在于怎么去比较工资大小以及怎么区分开?
再写具体思路前,先补充下题目需求的一个隐藏点,他的对比其实是局限于同部门的哈,一定要注意
那么我们开始结构化思路,一点一点来实现吧。
第一步:怎么区分开经理和员工捏?
这个就会用到EXISTS关键字,因为题目是有一个部门经理表dept_manager(经理就区分好啦),那在部门关系表dept_emp中,可以很快知晓里面有员工和经理信息,因此我们这里用EXISTS在dept_emp表中筛选出员工信息即可
select emp_no, salary, dept_no from dept_emp where not exists (select emp_no from dept_manager where dept_emp.emp_no = dept_manager.emp_no)
经理表就独自美丽啦,直接使用dept_manager即可。然后因为我们需求是跟薪水相关的,所以我们还需要跟salaries表进行关联以便后续的比较。这里我的思路是创建两个临时表(用with关键字),让代码看起来非常简洁。
哦对了,还有一个需求要注意下——"当前",这个意味着必须是在职员工,即to_date必须为"9999-01-01"
with dept_only_emp as( select dept_emp.emp_no, salary, dept_no from dept_emp left join salaries using(emp_no) where not exists (select emp_no from dept_manager where dept_emp.emp_no = dept_manager.emp_no) and dept_emp.to_date = '9999-01-01' and salaries.to_date = '9999-01-01' ), dept_only_manager as( select dept_manager.emp_no, salary, dept_no from dept_manager left join salaries using(emp_no) where dept_manager.to_date = '9999-01-01' and salaries.to_date = '9999-01-01' )
这里稍微注意下,千万不要创建多个with... as...,因为with语句后面必须是CTE语句(例如select语句等)。因此这里是用逗号分割多个子查询
第二步:怎么去比较捏?
关于这里,我脑海中一闪而过,为何不用Inner join去关联判断。因为连接语句后面的on 其实可以连接多个条件(这里不就可以用来判断薪水大小嘛,嘿嘿),当然用left join或者right join也可,但会多出很多值为none的列,需要自行额外去除啦。
整个SQL语句非常简单理解,日后若要多者对比的话可以考虑下连接滴~
select de.emp_no, dm.emp_no, de.salary, dm.salary from dept_only_emp as de inner join dept_only_manager as dm on de.dept_no = dm.dept_no and de.salary > dm.salary
那么将两者整合起来,便是最后通过的代码语句啦
with dept_only_emp as( select dept_emp.emp_no, salary, dept_no from dept_emp left join salaries using(emp_no) where not exists (select emp_no from dept_manager where dept_emp.emp_no = dept_manager.emp_no) and dept_emp.to_date = '9999-01-01' and salaries.to_date = '9999-01-01' ), dept_only_manager as( select dept_manager.emp_no, salary, dept_no from dept_manager left join salaries using(emp_no) where dept_manager.to_date = '9999-01-01' and salaries.to_date = '9999-01-01' ) select de.emp_no, dm.emp_no, de.salary, dm.salary from dept_only_emp as de inner join dept_only_manager as dm on de.dept_no = dm.dept_no and de.salary > dm.salary