牛客SQL.25

120 阅读2分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

描述

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

img

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

img

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

img

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

第一列给出员工的emp_no, 第二列给出其manager的manager_no, 第三列给出该员工当前的薪水emp_salary, 第四列给该员工对应的manager当前的薪水manager_salary

以上例子输出如下:

img

示例1

drop table if exists  `dept_emp` ; 
drop table if exists  `dept_manager` ; 
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 `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 salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','9999-01-01');
输出
10001|10002|88958|72527

方法一

根据题意要求出比自己领导工资还要高的员工,返回结果为员工编号、领导编号、员工薪资、领导薪资;根据dept_empdept_manager两张表,我们可以已经可以得到当前员工的领导是谁,距离最后的结果,我们只差一个条件,那就是当前员工的薪资是否要比领导高;而薪资这个字段在这两张表中并没有;那么,我们只需要将薪资这张表分别和以上两张表连接,返回在原表的基础上加上薪资的新表即可;

SELECT A.emp_no, B.emp_no AS manager_no, A.salary AS emp_salary, B.salary AS manager_salary
FROM 
(SELECT a.*, b.salary FROM dept_emp a, salaries b WHERE a.emp_no=b.emp_no) A,
(SELECT c.emp_no, c.dept_no, d.salary FROM dept_manager c, salaries d WHERE c.emp_no=d.emp_no) B
WHERE A.dept_no=B.dept_no AND A.salary>B.salary;

运行效果

从下图可以看到,输入的语句最终改变成如下:

SELECT a.emp_no, c.emp_no, b.salary AS emp_salary, d.salary AS manager_salary
FROM dept_emp a, salaries b, dept_manager c, salaries d
WHERE a.dept_no=c.dept_no AND b.salary>d.salary AND c.emp_no=d.emp_no AND a.emp_no=b.emp_no;

image-20211108162618918

表的关系由于太长就不贴了,c->a->b->d,开销为5.0001