题解 | #获取员工当前薪水比经理当前薪水还高的相关信息#

获取员工其当前的薪水比其manager当前薪水还高的相关信息

https://www.nowcoder.com/practice/f858d74a030e48da8e0f69e21be63bef

这道题大概花了15分钟想出了一个思路,其实我的纠结点在于怎么去比较工资大小以及怎么区分开

再写具体思路前,先补充下题目需求的一个隐藏点,他的对比其实是局限于同部门的哈,一定要注意

那么我们开始结构化思路,一点一点来实现吧。

第一步:怎么区分经理和员工捏?

这个就会用到EXISTS关键字,因为题目是有一个部门经理表dept_manager(经理就区分好啦),那在部门关系表dept_emp中,可以很快知晓里面有员工和经理信息,因此我们这里用EXISTSdept_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

全部评论

相关推荐

自从我室友在计算机导论课上听说了“刷 LeetCode 是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在 DP,请勿打扰,否则 Time Limit Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk is cheap. Show me the code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j] 代表第 i 个人坐在第 j 个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target node),我应该用 BFS 还是 DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点 (x, y),我们俩的路径有 k 个交点,为了最小化时间复杂度,应该在 (x/2, y/2) 处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是 O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到 O(log n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你 Two Sum 刷了几遍了?”“别提了,昨天遇到一道 Hard 题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode 真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务