首页 > 数据库 >牛客网——SQL218 获取所有非manager员工当前的薪水情况

牛客网——SQL218 获取所有非manager员工当前的薪水情况

时间:2023-08-28 18:01:54浏览次数:38  
标签:01 dept no SQL218 牛客 manager emp date NULL

描述

有一个员工表employees简况如下:

emp_no birth_date first_name last_name gender hire_date
10001 1953-09-02 Georgi Facello M 1986-06-26
10002 1964-06-02 Bezalel Simmel F 1996-08-03

有一个,部门员工关系表dept_emp简况如下:

emp_no dept_no from_date to_date
10001 d001 1986-06-26 9999-01-01
10002 d001 1996-08-03 9999-01-01

有一个部门经理表dept_manager简况如下:

dept_no emp_no from_date to_date
d001 10002 1996-08-03 9999-01-01

有一个薪水表salaries简况如下:

emp_no salary from_date to_date
10001 88958 1986-06-26 9999-01-01
10002 72527 1996-08-03 9999-01-01

获取所有非manager员工薪水情况,给出dept_no、emp_no以及salary,以上例子输出:

dept_no emp_no salary
d001 10001 88958

示例1:

drop table if exists  `dept_emp` ; 
drop table if exists  `dept_manager` ; 
drop table if exists  `employees` ; 
drop table if exists  `salaries` ; 
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1996-08-03');
INSERT INTO salaries VALUES(10001,88958,'1986-06-26','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','9999-01-01');

输出:

d001|10001|88958

我的解题思路:

  • 根据部门经理表找出所有经理的emp_no,使用子查询+not in 筛选出所有不是manager的emp_no
  • 再用内连接得到相应信息
select 
    de.dept_no as dept_no,
    t1.emp_no as emp_no,
    s.salary as salary
from (
select 
    emp_no
from employees
where emp_no not in (select distinct emp_no from dept_manager) 
) t1
inner join dept_emp de on t1.emp_no = de.emp_no
inner join salaries s on t1.emp_no = s.emp_no
where de.to_date = '9999-01-01'
;

更加优秀解题思路:

不使用not in

  • 找出所有非manger的emp_no,这里通过差集实现

    select t1.emp_no
    from employees t1
    left join dept_manager t2 on t1.emp_no = t2.emp_no
    where t2.emp_no is null
    ;
    
  • 再通过上表的 emp_no 去连接 dept_emp 和 salaries,找出对应的 dept_no 和 salary

  • 注意 salaries 的 to_date='9999-01-01'

select t4.dept_no, t3.emp_no, t5.salary
from(
 select t1.emp_no
 from employees t1
 left join dept_manager t2 on t1.emp_no = t2.emp_no
 where t2.emp_no is null
) t3
inner join dept_emp t4 on t3.emp_no = t4.emp_no
inner join salaries t5 on t3.emp_no = t5.emp_no
where t5.to_date='9999-01-01'
;

标签:01,dept,no,SQL218,牛客,manager,emp,date,NULL
From: https://www.cnblogs.com/moliyy/p/17663023.html

相关文章

  • 2023牛客暑期多校练营6 A-Tree 树上背包+并查集
    2023牛客暑期多校练营6A-Tree树上背包+并查集题目链接题意:给出一棵树,节点为黑色或者白色,定义整棵树的贡献为,任意白点到任意黑点所经过路径上的最大边权之和,节点i原本颜色已给出,可以花费c[i]代价翻转节点i的颜色,问最大贡献是多少。做法:首先我们思考怎么处理最大边权的问题......
  • 20230628 java.sql.DriverManager
    介绍java.sql.DriverManagerpublicclassDriverManager驱动管理器根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器则通过驱动程序与实际的数据库进行通信APIstaticgetConnectionConnectiongetLogWriter,setLogWritergetLoginTimeout,setLoginT......
  • 牛客网——同步复位异步释放
    verilog企业真题VL74 异步复位同步释放1)同步复位:指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。moduleload_syn_ff(clk,in,out,load,rst_n);inputclk,in,load,rst_n;outputout;always@(posedgeclk)if(!rst_n)out<=......
  • 【树状数组】牛客练习赛52 B.Galahad
    【树状数组】牛客练习赛52B.Galahad题目链接:https://ac.nowcoder.com/acm/contest/1084/B题意多组询问,计算区间和,但相同的数只能被计算一次。题解离线处理询问,按右端点排序。对于相同的数字,我们只能选一个加入到区间和中,我们是枚举右端点,所以选择最靠近右端点左边的数字最......
  • 牛客练习赛114 D题题解
    比赛编号太臭了题目链接对一第一组数据,我们形象化的得到下图:如何拆解使其变成一个“顺子”呢,我们像这样:贪心的从后往前取,对于取数列时的终点也就是枚举的起点如果不为0,就向前一直取,如果取到一个数\(x\)发现这个数的个数\(num_x\)是大于\(num_{x-1}\)的,就停止,最后看拆......
  • Prometheus+AlertManager+webhookdingtalk实现钉钉报警
    前提在我上一篇博文中(Prometheus_彭阳的技术博客_51CTO博客)介绍了,prometheus监控原理,监控服务搭建,prometheus内部函数...,如果还未搭建起prometheus服务和node_exporter实现机器初步监控的可以对照文章搭建起来,在这一小节将着重介绍prometheusalertmanager通过webhookdingta......
  • 2019年牛客普及模拟赛5
    字符统计:给出一个只包含空格和小写字母的字符串,问出现次数最多的字符(多个字符按照字典序输出)签到题。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intsum[250];charans[250];signedmain(){ //freopen("T1.in","r",stdin); //freopen("T1.out"......
  • 牛客七夕比赛 题解
    标准的算法竞赛题有下面几个,写这篇博客主要是这个M很有意思,一直没绕过来这个弯如果你有更牛逼的构造方法欢迎交流指导。B构造边长为\(n\)的矩阵,使得每个\(2\times2\)的子矩形的权值和的极差最小两个指针L=1,R=\(n^2\)。将网格黑白染色后按照顺序遍历,黑色填\(R\)......
  • 牛客网
    牛客网项目发送邮件邮箱设置启用客户端SMTP服务SpringEmail导入jar包邮箱参数配置使用javaMailSender发送邮件模板引擎使用Thymeleaf发送HTML邮件1.新建MailClient类@ComponentpublicclassMailClient{​  privatestaticfinalLoggerlogger=LoggerFa......
  • 一道牛客题相关的思考
    牛客多校202310H:\(F_0(x)=x\)\(F_k(x)=(x^2-1)F'_{k-1}(x)\)给定\(x_0\),求\(F_n(x_0)\)。场上我的做法:设\(f_{i,j}\)为\(F_i\)求\(j\)次导后,\(x_0\)的点值。那可以导出递推式:\(f_{i,j}=f_{i-1,j-1}\timesj(j-1)+f_{i,j}\timesj\times2x_0+f_{i-1......