三表连接查询 不用NOT IN

获取所有非manager员工当前的薪水情况

http://www.nowcoder.com/questionTerminal/8fe212a6c71b42de9c15c56ce354bebe

2022.02.15 更新

再次感谢评论区的朋友纠正!!!

之前有朋友评论区说的不用连接员工表就可以的方法最近又通不过了。。。所以掌柜再次更新了解法,下面是测试和提交都可以通过的代码:

SELECT d.dept_no, d.emp_no, s.salary FROM employees e 
JOIN dept_emp d ON e.emp_no = d.emp_no 
JOIN dept_manager d1 ON d.dept_no = d1.dept_no AND d.emp_no <> d1.emp_no 
JOIN salaries s ON d.emp_no = s.emp_no 
WHERE s.to_date = '9999-01-01' ORDER BY e.emp_no;

感谢大家的积极反馈🤝

-----------------------------------我是纠正分割线---------------------------------

看了好多解法都是用NOT IN 的, 我就说说我这个没用NOT IN 的解法吧。

  • 思路:

    • 首先还是employees表和dept_emp员工部门表连接,找到员工和部门的关系;
    • 接着连接dept_manager表,注意这里连接条件👉部门id即dept_no要相等;但是员工id即emp_no要不相等。emp_no不相等的就是非manager员工。
    • 最后连接salaries表,按emp_no连接,就找到每个员工对应的工资;别忘了筛选条件是当前日期!
  • 完整的代码就是:

SELECT d.dept_no, d.emp_no, s.salary FROM employees e 
JOIN dept_emp d ON e.emp_no = d.emp_no 
JOIN dept_manager d1 ON d.dept_no = d1.dept_no AND d.emp_no <> d1.emp_no 
JOIN salaries s ON d.emp_no = s.emp_no 
WHERE s.to_date = '9999-01-01' ORDER BY e.emp_no;

不过运行时间不是最优的🤣。

MySQL题解 文章被收录于专栏

本专栏主要对各种经典的MySQL题进行解说,希望用最易懂简洁的语言帮助大家通关MySQL。

全部评论
你这个思路不错。不过你的想法当中“先把employees 表和dept_emp 按emp_no连接,找到每个员工对应的部门。”这一步多余了,可以省略掉,因为部门员工关系表dept_emp已经包含了所有员工所对应的部门。简化一下: SELECT d.dept_no, d.emp_no, s.salary FROM dept_emp d join dept_manager dm ON d.dept_no = dm.dept_no AND d.emp_no <> dm.emp_no JOIN salaries s ON d.emp_no = s.emp_no
1 回复 分享
发布于 2021-11-24 22:32
这个解法有问题,卡bug,要是多个manager就G了
点赞 回复 分享
发布于 2024-08-26 10:11 四川
想问下 最后为啥一定要order by呢 题目没要求呢 但是我试了一下 这个方法不加order by 提交不通过
点赞 回复 分享
发布于 2023-08-31 02:33 江苏
如果是别的部门的领导 那不还是有
点赞 回复 分享
发布于 2022-11-29 16:34 广东
如果你的manager表一个部门里有多个manager会发生什么
点赞 回复 分享
发布于 2022-05-17 16:25
是什么让你可以进行测试通过但是提交运行不通过的呢
点赞 回复 分享
发布于 2022-02-14 17:06
员工表还是要连接的,考虑到有的员工还未分配部门,所以建议连接员工表,按员工表的emp_no做主键这样毕竟稳妥
点赞 回复 分享
发布于 2022-01-14 16:21
这样解提交运行说不对呀~为什么呢~
点赞 回复 分享
发布于 2021-12-22 21:54

相关推荐

不愿透露姓名的神秘牛友
07-23 14:10
柴子木:找个工作你还发上脾气了🤣
点赞 评论 收藏
分享
评论
10
2
分享

创作者周榜

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